3. 函数
一. 文件操作
1. 写,读,追加
f = open('test.txt','w',encoding='utf-8') # 拿到文件句柄
f.write('张三\n李四\n')
f.close
# a追加文件
f = open('test.txt','a',encoding='utf-8')
f.write('王五')
f.close
# r读文件
f = open('test.txt','r',encoding='utf-8')
print(f.read())
f.close
2. 读写r+
追加读:
f = open("test.txt",'w',encoding="utf-8")
f.write("张三\n")
f.close
# 在写之前进行了读操作,则会在末尾加入文件,没有进行读操作就写则从开头覆盖
f = open('test.txt','r+',encoding='utf-8')
print(f.readline()) # 行读
f.write("李四\n""王五\n")
f.flush() # 立即写入磁盘
f.seek(0) # 指定光标位置
print(f.readline().strip()) # strip方法去除字符空行
f.close()
3. 文件修改
把当前文件导入新文件:
f = open('test.txt','w',encoding='utf-8')
f.write('张三\n李四\n王五\n')
f.close
### with 自动关闭文件句柄
with open('test.txt','r',encoding='utf-8') as f , open('test2.txt','w',encoding='utf-8') as f2:
for i in f:
if '李' in i:
i = i.replace('李','赵') # 字符串替换
f2.write(i)
4. 方法
f.read() # 一次读取整个文件,文件大不适用
f.readline() # 一次只读取一行,占内存小,速度慢
f.readlines() # 一次性读取,将内容分析成一个行的列表,可以由for...in...处理
f.write(content) # 不会换行哦
f.writeline(content) # 下次会写在下一行
二. 字符转码
1. python2转码
- decode方法是把str类型的当前编码的字符串转为unicode类型的unicdoe编码的字符串
- encode方法是把unicode类型的unicdoe编码的字符串转为str类型的指定编码的字符串
s = "安"
print(type(s))
print(s.decode("utf-8")) # 默认以python2默认的assci解码
print(type(s.decode("utf-8"))) # 解码成unicode编码类型
print(s.decode("utf-8").encode("gbk")) # 编码成gbk
print(type(s.decode("utf-8").encode("gbk"))) # 是str类型
2. python3转码
- encode方法是把str类型的unicdoe编码的字符串转为bytes类型的指定编码的字符串
- decode方法是把bytes类型的当前编码的字符串转为str类型的unicdoe编码的字符串
s = "安" # 相当于python2中s = u"安",并且类型不再是unicode变成str
print(type(s)) # str
print(type(s.encode("utf-8").decode("utf-8"))) # str
print(type(s.encode("gbk"))) # bytes
函数传参
有返回值的面向过程
函数参数调用
#!/usr/bin/env python
#_*_coding:utf-8_*_
def test(x,y,z,s=1): # 形参,s=1默认参数
return x*y*z*s,x+y+z+s # 反回值(6,6)
print(test(1,3,z=2)) # 实参,关键参数不能放在位置参数前面
非固定传参
def test(*args): # 只能接受位置参数,转化元祖方式
print(args) # 结果(1, 3, 2)
test(1,3,2)
# test(*[1,3,2])
def test2(**kwargs): # 把N个关键字参数,转换为字典方式
print(kwargs) # 结果{'name': 'tom', 'age': 12}
test2(name='tom',age=12)
混合传参
位置传参在关键字传参前面
def test3(name,*args,age=18,**kwargs): # 非固定传参和位置参数,关键参数结合结合
print(name) # tom
print(age) # 12
print(args) # ('yes',)
print(kwargs) # {'sex': 'm'}
test3('tom','yes',sex='m',age=12)
作用域,递归
作用域
字符串和整数不能在局部里面改全局
#!/usr/bin/env python
#_*_coding:utf-8_*_
names = ["tom","luck"]
def change_name():
names[0] = "汤姆"
change_name()
print(names) # ['汤姆', 'luck']
递归
最大递归999层
特性:
- 必须有一个明确的结束条件
- 每次进入更深一层递归时,问题规模相比上一次递归都应有所减少
- 递归效率不高,递归层次过多容易导致栈溢出
def calc(n):
print(n)
if n/2 >1:
return calc(n/2) # 一直递归到n小于1
calc(10)
高阶函数
一个函数接收另一个函数作为参数:
def add(a,b,f):
return f(a)+f(b)
print(add(3,-6,abs)) # abs内置函数,取绝对值