目录

变量和类型

类型带来的意义-动态类型-(有利有弊 单人开发爽,多人开发不爽,还要写文档)

注释使用#

输入与输出-与类型转换

python不能把字符串和数字进行拼接

类型转换

运算符

算术运算符

关系运算符

逻辑运算符

链式求值

python不支持++,--

条件语句(if)-需要缩进组

while /for循环

continue/break

函数

Python一个函数可以返回多个值 (区别于C++,Java-(需要包装成一个对象))

外面的默认是全局变量,函数先尝试去局部变量查找,然后再去往上一级作用域,及全局~

函数加上特殊开关-便于调试

带有默认值的函数-灵活设计-(默认参数一定要放后面)

使用关键字传参

列表和(元组-对标数组)

创建列表

切片操作

设置步长

添加操作(这种要搭配对象来使用的函数)-append

使用in 判定某个元素是否在列表中存在

使用index方法,判定当前元素在列表中的位置,得到一个下标

使用pop删除列表中最末尾的元素

使用remove,根据值来删除

连接链表

使用extend来进行拼接

使用+=操作,如同extend(更加推荐)

元组(读取元组大部分和list一致,只可以读,不可以改)

元组初始化

元组遍历

可以使用for循环方式遍历元素

可以使用+来拼接两个元组

当进行多元赋值的时候,本质是按照元组的方式进行工作的

元组和列表的优/劣

字典(存储键值对 - 哈希表)

判断是否存在    - not in 来判定key在字典中不存在,通过下标的名字是key,来访问

字典添加元素-写,修改操作,(跟数组一样,非常爽了可以说)

字典删除-pop(key)

字典遍历-(效率不高)

keys获取字典中所有key

values获取字典中所有value

items获取字典中所有的键值对

合法key的类型-可哈希

文件操作-8193 是2的13次方

#使用open打开文件 -r按照读方式打开, -w表示write,表示写方式打开,-a append写打开,把内容写到原有的文件末尾

关闭文件

写文件

使用a方式打开 - 追加写

读文件内容

直接read,指定读几个字符  

更加常见的需求,按行读取- 最简单方法,直接for循环

读行的方法2:  一次读完

上下文管理器

python的库-(如同java的依赖)

datetime

字符串

文件搜索的代码-(文件不是文件夹 )

第三方库使用pip  - 包管理器

操作excel

程序员鼓励师

学生管理系统


avg=(67.5+89.0+12.9+32.2)/4
total=(67.5-avg)**2+(89.0-avg)**2+(12.9-avg)**2+(32.2-avg)**2
//**2代表 平方,也是非常简单的
print(total/3)



1173.2866666666666

计算机由以下几个组成

1.CPU        (Intel,AMD,高通)

2.存储器(内存,外存)存储数据

3.输入设备,键盘,鼠标,麦克风

4.输出设备,显示器,音箱,耳机,打印机

内存,外存的区别:

1.内存存储空间较小,外存的存储空间比较大。

2.内存访问速度快,外存访问速度慢。

3.内存没有外存大,内存的成本高(所以就会比外存小)

4.内存中的数据易丢失,外存中的数据持久化存储(断电数据也存储)

py

缺点,执行效率偏弱,多核心并发程序支持不好,动态类型系统对大型项目不友好(类型在运行时候,可以发生改变)

非常简单,没有java的类,方法啥的,直接就运行了

print("hello")
print(1 + 9 - 3)
print(1*9/7)     //默认是double类型,然后他的就是真除,并不是取整,而且编程中,没有四舍五入的规则,浮点数有内部规则,规则下处理浮点数,可能会有微小的误差。
print((67.5+2+30)/5)



7
1.2857142857142858
19.9

变量和类型

假如求方差:

1.先计算平均值,

2.分别针对每个数字,计算数字和平均值的差值,再平方

3.把上述平方值相加

4.除以项数-1

变量-存入内存中

type() //获取类型

a=10
print(type(a))
b="您好"
print(type(b))
c=1.11111111
print(type(c))
d='c';
print(type(d))
e=True
print(e)


//不区分字符和字符串
<class 'int'>
<class 'str'>
<class 'float'>    -c++/java-float四个字节的,也叫做单精度浮点数  ,把一个二进制位,称为bit,8个bit放在一起,就称为一个字节。double 八个字节-也叫双精度浮点数
float==double
<class 'str'>
<class 'bool'>

经典变量名字:字母数字下划线,数字不开头,不用关键字

int-数据范围是无穷(因此也没有long这样类型)

Python设计哲学-解决一个问题,只提供一种方案

我们可以发现,单引号和双引号,都是str

但是有啥区别呢

比如

k="My name is "LichuanLong"     -中间这个部分Python不认识了就

里面是单引号,就加双引号,里面是双引号就加单引号。

'My name is "Lcl" '

假如里面是双引号,就外面单引号,外面双引号,里面单引号,里面单双都有,那么三引号

字符串函数,len

k='''My name "is" 'LichuanLong' '''
print(len(k));


27

字符串拼接

k='''My name "is" 'LichuanLong' '''
a='hello'
print(a+k);

helloMy name "is" 'LichuanLong' 

我们不能把字符串和数字,混合相加

比如 

b1='hello'

b2=10

print(b1+b2)

类型带来的意义-动态类型-(有利有弊 单人开发爽,多人开发不爽,还要写文档)

1.不同的类型,占用的内存空间是不同的,占几个字节,

int 是默认4个字节,动态扩容

float固定8字节

bool一个字节即可

str变长的

2.不同的类型,对应能进行的操作是不同的

int/float ,+ - * /    不可以用len

str +     但是不可以-*/ ,可以用len

动态类型:

程序在运行过程中,类型有可能改变

可以从数字,转化成字符串啥的 

a=10
a="hello"
a=True
print(a)
a=False
print(a)

一定规模之后,动态类型劣势就体现, 一般公司都会进行一个重构

注释使用#

#这个是注释
"""
这是一个文档字符串,起到作用和注释意义,也是解释说明的效果
"""

输入与输出-与类型转换

输出

python不能把字符串和数字进行拼接
a=10
print(f"a = {a}")
print(f"a = {a+10}")

a = 10

f表示format -格式化      可以使用{}这样的语法,往字符串嵌入变量或者表达式。

输入

m=input("请输入一个整数:")
print(f"m = {m}")
print(type(m))

m = 10
<class 'str'>

input返回的值,其实是一个字符串

如果单纯拿到用户的输入,然后打印,按照str处理就好

假如后续要操作,还是要转化为int

a=input("请输入第一个整数")
b=input("请输入第二个整数")
print(f"a+b={a+b}")
a=int(a)
b=int(b)
print(f"a+b={a+b}")


请输入第一个整数1
请输入第二个整数2
a+b=12
a+b=3

类型转换

整数转化成字符串str()

字符串转为浮点数float()

a=input("请输入第一个整数")
b=input("请输入第二个整数")
c=input("请输入第三个整数")
d=input("请输入第四个整数")
a=float(a)
b=float(b)
c=float(c)
d=float(d)
avg=(a+b+c+d)/4
print(f"avg的值是{avg}")



请输入第一个整数1
请输入第二个整数2
请输入第三个整数3
请输入第四个整数4
avg的值是2.5

假如输入任意个数字-循环

运算符

算术,关系,逻辑 -0不可以做除数

算术运算符

运行时的错误-叫做抛出异常 -除0异常

抛出异常,本质和java大体相同。

py除精准除

求余数-

**是乘方运算      -同时支持小数次平方,比如0.5 就是根号

a=100;
print(f"a的平方是{a**2}")
print(f"a的根号是{a**0.5}")

a的平方是10000
a的根号是10.0

//地板除法 -对计算结果向下取整,跟java,C++的除法一致

但是-7//2     往较小的取,就会取到-4

a=-7;
print(f"a的向下取是{a//2}")
print(f"a的根号是{a**0.5}")


a的向下取是-4
a的根号是(1.6200554372175822e-16+2.6457513110645907j)

关系运算符

< > <=  >=    ==        字符串也可以比较(比较字典序列,比如h更先),中文比较大小,更没有意义了。中文属于是用多个字节构成的一个较大的数字来比较。

a = "hello"
b = "world"
print(a>b)
False

python == 和!=来比较字符串内容相同,是大部分语言遵守的规则(java,c是小众哥)

针对浮点数,使用==比较相等,存在一定风险

一般校验,看a-b的差值是否是一个非常小的数字,是否在误差范围之内,比如

a=0.1
b=0.2
print(f"a+b的值{a+b}")
print(0.3)



a+b的值0.30000000000000004
0.3
a=0.1
b=0.2
print(f"a+b的值{a+b}")
print(-0.000001<(a+b-0.3)<0.000001)
print(0.3)



a+b的值0.30000000000000004
True
0.3

逻辑运算符

and       &&  两侧操作数都为true,表达式值为true    

or          ll

not        !       取反

a=0.1
b=0.2
c=0.3
print(a<b and b<c)
print(a < b < c)    //上面的变式      这个相当于java的lambda

短路求值

比如 and 一个flase 后面就不用看了

or 一个ture, 后面也不用看了

还包括一些有意思的运算符

身份运算符(is not)   成员运算符(in, not in )    位运算符(& | ^ << >>)

链式求值

# 先把b=20,然后a=b 不建议用
a=b=20

a,b=10,20;  按照顺序的

交换操作也很有意思    -简单
a,b=b,a
print(a,b) 

python不支持++,--

先读取a ,才可以这样+1.

a=a+1     a+=1;

true=1 false=0(整数可以加布尔值,可以当成整数算数运算)     true 为1,false 为0

True Python认识的True

条件语句(if)-需要缩进组

这块就非常不同了

if xx:      (与别的语言不同的是,他表示条件的结束使用:)

        oooo(使用tab键作为缩进)

elif xx:   (还是结束使用   :   )                (把else if 合体了)

        kkkk(使用tab键进行缩进)

else:

        pppp

# 先把b=20,然后a=b 不建议用
choice=input("输入1表示学习 ,输入2表示摆烂:")
# 此处比较的是字符串1,而不是整数1  
if choice=='1':        #字符串‘1’
    print("成功")
elif choice=='2':
    print("失败")
else:
    print("666")

if,else,while,for 需要跟上代码块的部分,都是需要使用缩进表示

两级索引,就如同if(){ if(){ 这里面的语句块} }

a=input("请输入一个整数")
b=input("请输入一个整数")
if a=='1':
    if b=='2':
        print(f"b的值{b}")
    print(f"a的值{a}")
print(10)


请输入一个整数1
请输入一个整数2
b的值2
a的值1
10

多级条件嵌套,当前语句属于哪些代码块,完全取决于缩进的级别

多重条件的嵌套-两语句对应哪一级代码块,并不容易观察,因此写错容易出错

a=input("请输入一个整数")
#a的值是字符串,无法%2==0
a=int(a)
if a%2==0:
    print("当前值是偶数")
else:
    print("当前值是奇数")

在python中

假如-19%2 结果最后是1, 因为除数 2 是正数,所以取模结果必然是正数,最终得到 1

-19%-2 等于-1。   请输入一个整数-19       -1      实践出真知
 

但是java那边是-1    也需要注意

条件满足时候,什么都不做/啥都不写,就会出错     ,可以使用空语句占用位置pass

a=input("请输入一个数字:")
if a!='1':
    pass
else:
    print("hello")



请输入一个数字:1
hello

while /for循环

while 条件:

  xxx

#打印1-10的整数
num=1
while num<=100:
    print(num)
    num=num+1
print("循环已经完成")
#计算阶乘和
num=1
sum=0
while num<=5:
    #用来计算阶乘
    floater=1;
    i=1
    #依次计算每个阶乘
    while i<=num:
        floater*=i;
        i = i + 1
    #保存阶乘的和
    sum+=floater
    num+=1
print(f"sum的值是{sum}")
#可迭代对象,特殊变量,内部包含很多其他的值
//从1到11小于        range内建函数,获得到一个可迭代对象,包含一系列整数[begin,end)
for i in range(1,11):
    print(i)

range 还提供了第三个参数,表示步长值为1。

打印1,3,5,7,9

for i in range(1,11,2):
    print(i)
//后面那个2表示步子的长度
1
3
5
7
9

打印10-1

//步子长短是一个负数    打印从10-1
for i in range(10,0,-1):
    print(i)

它里面有些变量和你定义的重复名字了,所以需要改名

一般是shift +f6    但是有点f6是不太容易按,所以可以shift+fn+f6

continue/break

继续下次循环和结束当前循环

sum=0
for i in range(10,0,-1):
    if i==2:
        continue
    print(i)

python 只提供while和for,没有do while

函数

一段可以被重复使用的代码

#定义一个函数
def calSum(begin,end):
    theSum=0
    for i in range(begin,end+1):
        theSum+=i;
    print(f"theSume的值{theSum}")

calSum(1,100)

函数的定义

def -    define :定义

def  函数名     

-代码块需要带有缩进,才是内部的语句

-函数返回值,执行到return 就意味着,执行完毕了,return 后面的值,就是函数的返回值,return语句并非是必须的,可以有可以无。

2.函数调用(开始完成任务)

函数名(实参列表-实参)

假如定义函数,不去调用,那么内部就不会执行。

Python更推荐蛇形命名 比如cal_sum(但是你用啥都可以)

PEP8意思要求函数和调用,有两个空行

def test(begin,end):
    sum=0
    for i in range(begin,end+1):
        sum+=i;
//返回值,只负责运算,返回值,返回
    return sum
result=test(1,100)
print(result)

让逻辑和交互/界面分离

解耦合

True和False注意不是小写。

Python一个函数可以返回多个值 (区别于C++,Java-(需要包装成一个对象))

但是python天然可以返回多个值, -很有意思的机制

def getPoint():
    x=10
    y=20
    return x,y
a,b=getPoint()
print(a,b)



10 20

假如我们只想要一部分,不关注其他的,使用下划线给他忽略(就是把a的名字换成_,但是实际上和a没区别)。

外面的默认是全局变量,函数先尝试去局部变量查找,然后再去往上一级作用域,及全局~

假如想去改全局变量,使用global 说明他是全局变量的x

x=10
def change():
    global x
    x=20
print(x)



10

但是if,else,while ,for 这些关键字引入的代码块,不会对变量的作用域产生影响,即 可以在外面访问

递归

def f(n):
    if n==1:
        return 1
    return n*f(n-1)
print(f(5))

函数加上特殊开关-便于调试

def f(a,b,debug):
    if debug==True:
        print("打印")
    return a+b
print(f(1,2,True))
print("********")
print(f(1,2,False))


打印
3
********
3
带有默认值的函数-灵活设计-(默认参数一定要放后面)
def f(a,b,debug=False):
    if debug==True:
        print("打印")
    return a+b
print(f(1,2,True))
print("********")
print(f(1,2))

打印
3
********
3
使用关键字传参
def test(x,y):
    print(f"x={x}")
    print(f"y={y}")
#按照参数的名字来传参
test(x=10,y=20)
test(y=200,x=10)


x=10
y=20
x=10
y=200

关键值参数,一般都是搭配默认参数使用的,一个函数提供很多的参数,为了降低使用成本,对大部分参数设定出默认值

当调用者需要调整其中一部分参数时候,可以搭配关键字进行操作。

列表和(元组-对标数组)

如果表示的数据少,直接定义几个变量就好

列表是可变的:创建好了,随时能改

元组是不可变的:创建好了,改不了,要是想改,只能丢弃旧的,搞个新的

创建列表

#直接使用字面值来创建
#[]表示一个空列表     -优点,可以指定初始值
a=[]
b=list()
print(type(a))
print(type(b))


<class 'list'>
<class 'list'>

a=[1,2,3,4]     
print(a)

 #优点2:可以在同一个列表里存放不同类型的变量,可以随心所欲的往里面放值
a=[1,True,[4,5,6],7]
print(a)

[1, True, [4, 5, 6], 7]

列表访问下标-并且修改

a=[1,True,[4,5,6],7]
print(a[1])
print(a[2])
print(a[3])
a[2]=100
print(a[2])
print(len(a))


True
[4, 5, 6]
7
100
4

Python下标可以写成负数,负数就是len(a)-1   =    a[-1]         ,相当于简化了len。

切片操作
#切片操作
a=[1,True,[4,5,6],7]   #左闭右开
print(a[1:3])

#切片操作-省略边界,从开始位置,一直到整个结束
a=[1,True,[4,5,6],7]
print(a[1:])

#切片操作-省略边界,从开始位置,到结束位置
a=[1,True,[4,5,6],7]
print(a[:3])
#切片操作-省略边界, 也可以是-1,但是注意是左闭右开
a=[1,True,[4,5,6],7]
print(a[:-1])


[True, [4, 5, 6]]
[True, [4, 5, 6], 7]
[1, True, [4, 5, 6]]
[1, True, [4, 5, 6]]


#切片操作-省略边界,都省略,就是全体都打印一遍
a=[1,True,[4,5,6],7]
print(a[:])
[1, True, [4, 5, 6], 7]


设置步长
a=[1,True,[4,5,6],7]
print(a[::2])
#隔着一个取一个
[1, [4, 5, 6]]

步长也可以是负数,从后往前取值

a=[1,True,[4,5,6],7]
print(a[::-2])

[7, True]

当切片超出有效下标时候,不会有异常,而是尽可能的把符合要求的元素获取到

a=[1,True,[4,5,6],7]
print(a[0:100])
#底层不是复制,而是正常获取,所以性能比较优秀
[1, True, [4, 5, 6], 7]
a=[1,True,[4,5,6],7]
for elem in a:    #i代表列表内每个元素,他是把每个值赋值给elem
    print(elem)

1
True
[4, 5, 6]
7

#for循环遍历,通过下标的方式
a=[1,True,[4,5,6],7]
for i in range(0,len(a)):     //这个是获取range里面的元素,我们可以进行操作的
    a[i]=i+10
print(a)

使用while遍历

#使用while循环,通过下标遍历
a=[1,2,3,4,5]
i=0
while i<len(a):
    print(a[i])
    i+=1
添加操作(这种要搭配对象来使用的函数)-append
a=[1,2,3,4]
a.append(5)
a.append("你好")
print(a)
#可以使用insert方法,往列表的任意位置添加元素
a.insert(1,"hello")
print(a)
#假如我们insert(100,'k')越界的话,他就会默认放最后面


[1, 2, 3, 4, 5, '你好']
[1, 'hello', 2, 3, 4, 5, '你好']
使用in 判定某个元素是否在列表中存在
a=[1,2,3,4]
print(1 in a)
print (10 in a)


True
False
使用index方法,判定当前元素在列表中的位置,得到一个下标
a=[1,2,3,4]
print(1 in a)
print (10 in a)
print(a.index(1))
print(a.index(100))    #越界报错就完事了


True
False
0
Traceback (most recent call last):
  File "/Users/lcl/PycharmProjects/PythonProject3/my_main.py", line 103, in <module>
    print(a.index(100))
ValueError: 100 is not in list
使用pop删除列表中最末尾的元素
#使用pop()可以删除任意位置的元素,pop的参数可以传递一个下标过去
a=[1,2,3,4]
a.pop()    #默认是删除末尾元素
print(a)
a.append(1)
a.pop(0)
print(a)
使用remove,根据值来删除
#remove方法,可以按照值来进行删除。
a=[1,2,3,4]
a.append("hello")
print(a)
a.remove("hello")
print(a)

连接链表

#使用+拼接列表
a=[1,2,3,4,5]
b=[6,7,8,9,10]
c=a+b
print(c)

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

使用+号的时候,只是出来一个新的,但是a,b没有变化,如同字符串拼接

使用extend来进行拼接

#使用extend:把后面一个的链表,拼接到前一个列表里面
a=[1,2,3,4,5]
b=[6,7,8,9,10]
c=a.extend(b)         #因为没有返回值的是
print(c)
print(a)
print(b)


None       -表示什么都没有
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
[6, 7, 8, 9, 10]

None如同C的NULL,java的null

使用+=操作,如同extend(更加推荐)

a.extend(直接b拼接,更加高效一点)和a+=b  (把a的值扔了,重新赋值)

元组(读取元组大部分和list一致,只可以读,不可以改)

#创建元组
a=()
print(type(a))
b=tuple()
print(type(b))
元组初始化
#如何指定初始值,也可以任意类型
a=(1,2,3,4,True,[1,2],(3,4))
print(a)

<class 'tuple'>
<class 'tuple'>
(1, 2, 3, 4, True, [1, 2], (3, 4))

通过下标来访问元组中的元素,下标也是从0开始,到len-1结束,越界报错

a=(1,2,3,4)

print(a[1])

print(a[-1])

print(a[100])

2
4
Traceback (most recent call last):
  File "/Users/lcl/PycharmProjects/PythonProject3/my_main.py", line 133, in <module>
    print(a[100])
IndexError: tuple index out of range
元组遍历
a=(1,2,3,4)

print(a[1:3])

#和列表大致一致
(2, 3)
可以使用for循环方式遍历元素
a=(1,2,3,4)
for elem in a:
    print(elem)
print(3 in a)
print(a.index(3))

1
2
3
4
True
2
可以使用+来拼接两个元组
a=(1,2,3)
b=(4,5,6)
print(a+b)

(1, 2, 3, 4, 5, 6)
当进行多元赋值的时候,本质是按照元组的方式进行工作的
def getPoint():
    x=10
    y=20
    return x,y
x,y=getPoint()
print(x,y)

10 20

元组和列表的优/劣

假如把参数传递过去了,A是否会把我的参数内容给改了呢?,因此使用的元组作为参数,就可以避免这样的纠结    ,元组 - 不可变对象,是可以哈希的

字典(存储键值对 - 哈希表)

#创建字典
a={}
print(type(a))
b=dict()
print(type(b))

#创建字典同时设置初始值  包含两个键值对  ,key是id value 是1 。  key是name 。value是zhangsan
a={'id':1,'name':'zhangsan'}
print(a)

<class 'dict'>
<class 'dict'>
{'id': 1, 'name': 'zhangsan'}

添加键值对,推荐以多行的形式,比如 直观,如同json的逗号格式

a={
    'id':1,
   'name':'zhangsan'
}
判断是否存在    - not in 来判定key在字典中不存在,通过下标的名字是key,来访问
a={
    'id':1,
   'name':'zhangsan'
}
#使用in来判定某个key是否存在某个key
print('id' in a)
print('id' not in a)
print('zhangsan' not in a)
print(a['id'])
print('name' in a)
print(a['name'])


True
False
True
1
True
zhangsan

假如访问不存在的a['key']值,会报错,当前key在字典中不存在

对于字典来说,使用in 或者[]来获取value,都很搞笑

但是列表,使用in比较,低效,需要遍历一遍, 使用[]比较高效

字典添加元素-写,修改操作,(跟数组一样,非常爽了可以说)
a={
    'id':1,
   'name':'zhangsan'
}
a['password']=90
print(a['password'])
a['password']=80
print(a['password'])

90
80
字典删除-pop(key)
a={
    'id':1,
   'name':'zhangsan'
}
a['password']=90
print(a['password'])
a['password']=80
print(a['password'])
a.pop('password')
print(a)


90
80
{'id': 1, 'name': 'zhangsan'}
字典遍历-(效率不高)
a={
    'id':1,
   'name':'zhangsan'
}
a['password']=90       #哈希链表,遍历是有序的
for key in a:            #key-只算一个代号,其实叫什么都行,这个字典我理解LinkedHashMap
    print(key,a[key])
keys获取字典中所有key
values获取字典中所有value
items获取字典中所有的键值对
a={
    'id':1,
   'name':'zhangsan'
}
a['password']=90
print(a.keys())
print(a.values())
print(a.items())


dict_keys(['id', 'name', 'password'])
dict_values([1, 'zhangsan', 90])
dict_items([('id', 1), ('name', 'zhangsan'), ('password', 90)])

可以当作列表使用,但是返回的不是列表

a={
    'id':1,
   'name':'zhangsan'
}
a['password']=90
for key,value in a.items():
    print(key,value)

id 1
name zhangsan
password 90

合法key的类型-可哈希

python中,专门提供了hash这个函数。元组,整数,浮点,bool,这个可以,但是列表(list),字典也不行会直接报错

print(hash('hello'))

-5727897689096063603

不可变的对象,一般可以hash,但是可变的,无法hash.

文件操作-8193 是2的13次方

#使用open打开文件
-r按照读方式打开,
-w表示write,表示写方式打开,
-a append写打开,把内容写到原有的文件末尾
#使用open打开文件  -r按照读方式打开
f=open('/Users/lcl/Desktop/测试文件操作.txt','r')
print(type(f))

<class '_io.TextIOWrapper'>

返回了一个文件对象

文件对象是内存上的一个变量,后续读写操作都是拿文件对象进行操作。-句柄,就是远程操控的遥控器

关闭文件
f.close()     -  文件打开之后一定要去关闭,打开文件是在申请一定的系统资源,所以不需要使用文件时候,资源应该及时释放。-不然容易造成文件资源泄露,导致别的资源打不开(资源有限,近8k个(8189(个)+3=8193),当然你系统里面可以设置,可以适当放宽,但是也是有限制的)

小知识:标准输入,标准输出,标准错误-键盘,显示器,显示器 -这个是默认打开的三个文件,所以+3就凑够了

python(也有垃圾回收GC):文件对象在循环一次,下个循环之后,就自动回收了

写文件
#使用open打开文件  -r按照读方式打开
f=open('/Users/lcl/Desktop/测试文件操作.txt','w')
#覆盖写,假如用r方式打开,再去写,会报错
f.write("hello")
f.close()

写方式打开,两种情况,一个直接写,一个追加写

这个就是直接写,会先情况,然后你write,去写,不然就是直接空。

使用a方式打开 - 追加写
#使用open打开文件  -r按照读方式打开
f=open('/Users/lcl/Desktop/测试文件操作.txt','a')
#覆盖写,假如用r方式打开,再去写,会报错,换行符,就是转义字符
f.write("\nworld")
f.close()
读文件内容
直接read,指定读几个字符  

注意假如是中文-代码默认是按照GBK,utf-8更加广泛

f=open('/Users/lcl/Desktop/测试文件操作.txt','r')
#覆盖写,假如用r方式打开,再去写,会报错,换行符,就是转义字符
result=f.read(2)
f.close()
print(result)

手动指定字符编码utf-8

#使用open打开文件  -r按照读方式打开
f=open('/Users/lcl/Desktop/测试文件操作.txt','r',encoding='utf-8')
#覆盖写,假如用r方式打开,再去写,会报错,换行符,就是转义字符
result=f.read(2)    #读取两个字符,
f.close()
print(result)
更加常见的需求,按行读取- 最简单方法,直接for循环
f=open('/Users/lcl/Desktop/测试文件操作.txt','r',encoding='utf-8')
for line in f:
    print(f"line={line}")
print("*********")
for e in f:
    print(f"e={e}")
f.close()


问题发现1,两个都可以正常打印,但是放在一起,只打印一个,
问题发现2:他每次都隔一行打印
line=懒洋洋大王来了

line=helloworld

line=world

line=world

*********

默认情况下,这个end代表默认有一个空行,我们给他改成空格就好

f=open('/Users/lcl/Desktop/测试文件操作.txt','r',encoding='utf-8')
for line in f:
    print(f"line={line}",end='')
print("*********")
for e in f:
    print(f"e={e}")
f.close()


line=懒洋洋大王来了
line=helloworld
line=world
line=world
*********
读行的方法2:  一次读完
f=open('/Users/lcl/Desktop/测试文件操作.txt','r',encoding='utf-8')
lines=f.readlines()
print(lines)
f.close()

['懒洋洋大王来了\n', 'helloworld\n', 'world\n', 'world\n']

上下文管理器

因为有些情况,你把close放最后面了,但是有一个条件,直接跳出,就不去支持close了

当with代码块执行结束时候,就会自动执行f的close

def fe():
    with open('/Users/lcl/Desktop/测试文件操作.txt','r',encoding='utf-8') as f:
        i=1
        if i==1: 
            return

python的库-(如同java的依赖)

标准库      -python自带

第三方库   -大佬们做出来的

datetime

import datetime
#先构造datatime变量 ,前面模块,后面是模块里面包含的类型
date1=datetime.datetime(2025,9,29)
date2=datetime.datetime(year=2025,month=9,day=27)
print(date1-date2)

2 days, 0:00:00


#这个方法也可以
from datetime  import  datetime
date1=datetime(2025,9,29)
date2=datetime(year=2025,month=9,day=27)
print(date1-date2)

字符串

I am student 翻转成 student am I

#有时候,动态类型,不知道能不能使用对应方法
def reverseWord(s: str):
    tokens=s.split(' ')
    tokens.reverse()
    return ' '.join(tokens)
print(reverseWord('I am student'))

旋转自负

s="abcde" ->bcdea ->cdeab ...

把左侧的字符,放到最右侧

def reverseWords(s: str,goal):
    if(len(s)!=len(goal)):
        return False
    return goal in (s+s)
print(reverseWords("abcde","cdeab"))

统计前缀,是否以这个字符串开头的

startwith

def countPrefixes(words:list,s:str):
    count=0
    for word in words:
 #s是以word开头
       if s.startswith(word):
           count+=1
    return count
print(countPrefixes(['a','b','c','d','ab','abc'],'abc'))

文件搜索的代码-(文件不是文件夹 )

import os
inputPath=input('请输入你要搜索的路径')
pattern=input('请输入你要搜索的关键词')
#找目录,以及子目录,遇到子目录,也要去查找,往深找,
# 使用os.walk 这个是遍历操作系统目录的操作。简单循环就可以,无需递归了
#分别代表,对应路径,对应的目录,列表包含多个文件名字
for dirpath,dirname,filenames in os.walk(inputPath):
    # print(f"dirpath:{dirpath}")
    # print("-------------------")
    # print(f"dirname:{dirname}")
    # print("-------------------")
    # print(f"filenames:{filenames}")
    for f in filenames:
        if pattern in f:
            print(f"{dirpath}/{f}")

第三方库使用pip  - 包管理器

python搞了一个网址-pypi,直接使用pip工具,就可以下载第三方库

命令行程序,点击那个teminal中断

pip install +库名 

如使用python 制作二维码

import  qrcode
img=qrcode.make('密码是李传龙真滴帅')
img.save('qrcode.jpg')

操作excel

假如统计班级内xx,为xx的,所以需要操作excel的库

读取excel-xlrd      -带版本号 ,新版本的不只是xlsx

 pip install xlrd==1.2.0

//之前加入按照别的了,直接就会替换

修改excel,使用xlwt

pip install xlwt
import xlrd
#1.先打开xlsx文件
xlsx=xlrd.open_workbook('/Users/lcl/Desktop/工作簿2.xlsx')
#2.获取到指定的标签页
table=xlsx.sheet_by_index(0)
#3.获取到表格里面有多少行
nrows=table.nrows
print(f"nrows={nrows}")
#4.进行循环统计操作
for i in range(0,nrows):
    #拿到当前的下标,打印第0列
    print(table.cell_value(i,0))

计算平均分

import xlrd
#1.先打开xlsx文件
xlsx=xlrd.open_workbook('/Users/lcl/Desktop/工作簿2.xlsx')
#2.获取到指定的标签页
table=xlsx.sheet_by_index(0)
#3.获取到表格里面有多少行
nrows=table.nrows
total=0
count=0
print(f"nrows={nrows}")
#4.进行循环统计操作
for i in range(1,nrows):
    name=table.cell_value(i,0)
    classId=table.cell_value(i,1)
    if(classId==5):
        print(name)
        print(table.cell_value(i,2))
        total+=table.cell_value(i,2)
        count+=1
print(total)
print(count)
print(f"平均分:{total/count}")

程序员鼓励师

背景,每隔一段时间,让电脑发出声音,鼓励一下我们

playsound第三方库

舰艇键盘按键,比如连续按键N次,播放一个音频,且每次播放的都不同, pynput

老版本的更吃香

pip install pynput==1.6.8
pip install playsound==1.2.2

准备音频文件,拷贝项目中

from pynput import keyboard
from playsound import playsound
soundList = ['sound1.mp3', 'sound2.mp3', 'sound3.mp3']
def onRelease(key):
    """
    这个函数,用户在释放键盘按键的时候,就会被调用到,
    这个函数不是我们主动调用,而是函数交给Listener,Listener在拥护释放按键时候。自动调用
    像是这种不是主动调用,而是交给别人,在合适的时机调用,-回调函数
    key:用户按下了,哪个键
    """
    print(key)
    global count
    count += 1
    if count%10==0:
        # 播放音频! 每10个字,放歌
        #生成随机数,从声音的第一个,到最后一个,随机出
        i=random.randint(0,len(soundList)-1)
        playsound(soundList[i])

listener=keyboard.Listener(on_release=onRelease)
listener.start()
listener.join()

但是播放音频消耗时间比较多,会引起输入的卡顿,可以去创建一个线程

学生管理系统

新增学生,显示学生,增删查改,保存到文件-   这个是对应的代码练手

def menu():
    print('1:新增学生')
    print('2.显示学生')
    print('3查找学生')
    print('4.删除学生')
    print('0.退出程序')
    choice = (input('请输入你的选择'))
    return choice
#列表的每一个元素都是一个字典,每个字典表示一个同学,(字典如同哈希表和对象合在一起了)

students=[]
def insert():
    print('新增学生')
    studentId=input("请输入学生学好:")
    name=input("请输入学生姓名:")
    gender=input("请输入学生的性别:")
    if gender not in ('男','女'):
        print("性别输入不符合要求")
        return
    classname=input("请输入学生班级")
    #使用一个字典给封装起来 -变成对象那种情况了
    student={
        'studentId':studentId,
        'name':name,
        'gender':gender,
        'classname':classname,
    }
    global students
    students.append(student)
    save()
    print('添加学生完毕')


def find():
    #根据学生姓名查找
    print('查找学生开始')
    count=0;
    name=input('请输入要查找的同学姓名')
    for s in students:
        if name==s['name']:
            print(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['classname']}")
            count+=1;
    print(f"共查找到:{count}")
    print('查找学生结束')


def show():
    # 遍历全局变量的列表
     print('显示学生开始')
     for s in students:
         print(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['classname']}")
     print(f'[显示学生完毕]一共显示了{len(students)}条数据')
def delete():
    print('删除学生开始')
    studentId=input('请输入要删除的学生学号')
    for s in students:
        if studentId==s['studentId']:
            print(f"已删除这个同学{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['classname']}")
            students.remove(s)
    print('删除学生结束')
    save()
    print()
def main():
    """
    入口函数
    通过控制台和用户交互
    增删查改
    """
    print("欢迎来到学生管理系统")
    #程序启动的时候,读档一次就好
    load()
    while True:
        #通过menu函数来打印菜单项
        choice=menu()
        if choice=='1':
            insert()
        elif choice=='2':
            show()
        elif choice=='3':
            find()
        elif choice=='4':
            delete()
        elif choice=='0':
            print("bye")
            #退出
            sys.exit()
        else:
            print("您的输入有误")
def save():
    """
    用于存档
    此处这个路径不是以d:开头的绝对路径,而是相对路径
    此时这个写法的含义就是让recode.txt和当前code66.py在同一个目录里面
    :return:
    """
    with open('record.txt','w',encoding='utf8') as f:
        for s in students:
            #注意要去换行
            f.write(f"{s['studentId']}\t{s['name']}\t{s['gender']}\t{s['classname']}\n'")
            print(f'[存档成功]共存储了{len(students)}条记录')
#读档操作
def load():
    """
    如果存档文件不存在,则直接跳过读档
    """
    if not os.path.exists('record.txt'):
        return
    #读档时候,要清理旧的睡觉
    global students
    with open('record.txt','r',encoding='utf-8')as f:
        for line in f:
            #针对这一行数据,按照\t进行切分操作!
            #切分之前,要去除开头和末尾的换行,功能是去掉一个字符串开头和末尾的空白符号,
            # 比如空格,换行
            line=line.strip()
            tokens=line.split('\t')
            if len(tokens)!=4:
                print(f'当前行存在问题! line:{line}')
                continue
            student={
                'studentId':tokens[0],
                'name':tokens[1],
                'gender':tokens[2],
                'classname':tokens[3],
            }
            #添加进去
            students.append(student)
            #加载存档逻辑
    print(f'[读档成功]共读取了{len(students)}条记录!')
main()

Logo

更多推荐