Python学习日记(六)——内置函数和文件操作(lambda)
lambda表达式
学习条件运算时,对于简单的 if else 语句,可以使用三元运算来表示,即:
# 普通条件语句 if 1 == 1: name = 'prime' else: name = 'ciri' # 三元运算 name = 'prime' if 1 == 1 else 'ciri'
对于简单的函数,也存在一种简便的表示方式,即:lambda表达式
#普通函数 # 定义函数(普通方式) def func(arg): return arg + 1 # 执行函数 result = func(123) # lambda表达式 # 定义函数(lambda表达式) my_lambda = lambda arg : arg + 1 # 执行函数 result = my_lambda(123)
内置函数
函数功能
all() -- 每个元素为真就为真 any() -- 只要有一个真就是真 bin()十进制转二进制 hex()十进制转十六进制 int()所有的通过它转成十进制 oct()十进制转八进制 bool() -- 判断真假 bytes() -- 字符串转换成字节 str() -- 字节转成字符串串 chr() -- 数字转字母 ord() -- 字母转数字 dir() --帮助 help() --详细功能 enumerate() -- 对于一个可迭代的(iterable),enumerate将其组成一个索引序列,利用它可以同时获得索引和值 eval() -- 执行表达式,返回结果 exec() -- 执行表达式,没有返回结果 filter() -- 过滤,接收两个参数(函数,迭代的东西) map() -- 让序列里的每一个元素,都做一个加工(例如:让每一个值都+100) globals() -- 查看所有的全局变量 locals() -- 查看所有的局部变量 id() -- 查看内存地址 input() -- 获取输入 isinstance() -- 对象是不是指定类型 lens() -- 查看长度 max() -- 取最大值 min() -- 取最小值 sum() -- 取和 pow() -- 指数 range() -- 范围 round() -- 四舍五入 sorted() -- 排序 type() -- 查看对象的类型 zip() -- 把两个列表的同一个位置元素,拿出来 open() -- 操作文件
#abs()--绝对值 i = abs(123) print(i) i = abs(-123) print(i) #all()--循环参数,如果每个元素都为真,那么all的返回值为真 r = all([True,True]) print(r) #什么是假的? print(bool(0))#只有0是假的 print(bool(None))#False print(bool(''))#空字符串是假的 print(bool([]))#空列表是假的 print(bool(()))#空元组是假的 print(bool({}))#空字典也是假的 #any()--循环参数,只要一个元素为真,那么any的返回值为真 #i = any(None,"",[],{},(),1) #print(i) # bin()二进制 # oct()八进制 # int()十进制 # hex()十六进制 r = bin(11) r = oct(11) r = hex(11) #bool()--判断真假,把一个对象转换成布尔值 #bytes()--表示字节 #bytearray()--表示字节列表[asd] #chr(65)#找到这个数字对应的ascii码对应的符号 #ord(a)#找到字符对应的ascii码 #callable()--是否能够被执行 #def f1(): # return 123 f1 = 123 #不能加括号,给了你一个东西后面能加括号表示是可执行的 r = callable(f1) print(r) #dir()--看函数提供了哪些功能 #help()--查看函数的详细功能 #divmod--取商和余数 a = 10/3 print(a) r = divmod(10,3) print(r) #输出结果:(3, 1),商和余数 #eval()--可进行字符串形式的数值运算 #exec()--可移执行,字符串形式的表达式 a = "1 + 3" print(a) ret = eval("1 + 3") print(ret) ret = exec("for i in range(10):print(i)") print(ret) #compel--编译代码 #eval--表达式,返回值 #exec--执行py代码 #range--创建范围内指定的数 n = range(10) print(n)#输出的是一个range类,不创建 for i in n: print(i) #默认不创建,循环时创建 #filter()--过滤,循环可迭代的对象,获取每一个参数,函数参数 #map()--map(函数,可迭代的对象) def f1(x): if x > 22: return True else: return False ret = filter(f1,[11,22,33,44]) #print(ret)会输出一个filter对象,类似range默认不会在内存中创建,使用时才会创建 for i in ret: print(i) #filter接收两个参数,一个是函数,一个是可以迭代的对象 #迭代每一次都执行函数,返回True表示符合条件,符合条件就放到ret里 li = [1,2,3,4,5] def f1(x): return x+100 ret = map(f1,[1,2,3,4,5]) print(ret) for i in ret: print(i) #map接收两个参数,一个是函数,一个是可以迭代的对象 #迭代每一次都执行函数,把所有的返回值都放到ret中 #globals()获取所有的全局变量 #locals()获取所有的局部变量 #hash()算哈希值 # max()--取最大值 # min()--取最小值 #pow()--求指数 i = pow(2,100) #2的100次方 print(i) #round()四舍五入 #zip--在两个列表或元组中,把同一个元素结合起来,形成新的元组 li1 = [11,22,33,44] li2 = ["a","BB","C","E"] r = zip(li1,li2) print(r) for i in r: print(i) #输出结果: # (11, 'a') # (22, 'BB') # (33, 'C') # (44, 'E')
filte和map函数,功能内部实现
#filter内部实现 def MyFilter(func,seq): #func代表函数,seq代表列表 result = [] for i in seq: ret = func(i) if ret: result.append(i) return result def f1(x): if x > 22: return True else: return False r = MyFilter(f1,[11,22,33,44]) print(r) #map的内部实现 def MyMap(fun,arg): #fun代表函数,arg代表列表 result = [] for i in arg: ret = fun(i) result.append(ret) return result def x(arg): return arg + 100 r = MyMap(x,[11,22,33,44]) print(r)
函数使用实例——随机验证码
import random #思路 #生成一个随机数:65-90,导入random模块 #数字转换成字母:chr(数字) #ASCII:A-Z:65-90 #生成纯字符验证码 temp ="" for i in range(4): i = random.randrange(65,91) c = chr(i) temp += c print(temp) #生成数字和字符混合的验证码 temp = "" for i in range(6): num = random.randrange(0,4) if num == 3 or num ==1:#等于3和1的时候生成一个数字,等于0,2生成一个一个字母 rad2 = random.randrange(0,10) temp += str(rad2) else: rad1 = random.randrange(65,91) c1 = chr(rad1) temp += c1 print(temp)
python中的排序
li = [1,22,31231,4215,324,12] print(li) li.sort() print(li) new_li = sorted(li) #sorted就是调用list里面的sort() print(new_li) char = ["z","123","1","23","45","asb","abd","c","我","爱","你"] new_chat = sorted(char) print(new_chat) #for i in new_chat: #查看字节 # print(bytes(i,encoding='utf-8')) #输出结果:['1', '123', '23', '45', 'abd', 'asb', 'c', 'z', '你', '我', '爱'] #字符串和数字不能混在一起排序,在一起会报错 #数字排序就是按照大小来 # 字符串排序--数字优先,然后是字母,最后是中文 #排列顺序按照元素一个一个的比较
注:进制之间的转换
#进制之间的转换 int(10)#加一个参数就是把十进制的数转换成十进制的数 i = int('0b11',base=2) #二进制是0b,把二进制转成十进制,0b可省略 print(i) i = int('11',base=8) #八进制是0o,把8进制转成十进制,0o可省略 print(i) i = int('0x11',base=16) #十六进制是0h,把16进制转成十进制,0x可省略 print(i)
文件处理
Open函数,该函数用于文件处理
操作文件时,一般需要经历如下下步骤
- 打开文件
- 操作文件
- 关闭文件
一、打开文件
文件句柄 = open('文件路径', '模式')
打开文件时,需要指定文件路径和以何等方式打开文件,打开后,即可获取该文件句柄,日后通过此文件句柄对该文件操作。
打开文件的模式有:
- r,只读模式【默认】
- w,只写模式【不可读;不存在则创建;存在则清空内容】
- x,只写模式【不可读;不存在则创建,存在则报错】
- a,追加模式【不可读;不存在则创建;存在则只追加内容】
现有一个文件
文件名:ha.log 文件内容:ciri
#r--只读模式 f = open("ha.log","r") data = f.read() #f.write()会报错 f.close() print(type(data)) print(data) #w--只写模式 f = open("ha.log","w") f.write("456") #把文件内容改成456 f.close() #x--只写模式 f = open("ha2.log","x") #创新一个新文件ha2.log f.write("456") f.close() #a--追加模式 f = open("ha.log","a") f.write("456") #在文件内容最后面添加456 f.close()
"+" 表示可以同时读写某个文件
现有一个文件
文件一:文件名:ha.log 文件内容:ciri
- r+,读写【可读,可写】
#r+ f = open("ha.log",'r+',encoding="utf-8") data = f.read() #读第一次 print(type(data),data) print(f.tell()) #获取指针位置 f.write("意大利") print(f.tell()) #获取指针位置 data = f.read() #写后,第二次读 print(type(data),data) f.seek(0) #调整指针位置,到最前面
data = f.read() #第三次读 print(type(data),data) f.close() 输出结果: <class 'str'> ciri 4 13 <class 'str'> <class 'str'> ciri意大利 #从此一次获取指针位置的结果可以看出,在进行读的操作后,指针移动到了,读取的数据的后面 #从第二次获取指针位置的结果可以看出,在进行写的操作后,指针移动到了最后面("ciri"--四个字节,"意大利"--9个字节) #所以第二次的读操作没有内容 #因为在第三次读之前,把指针位置调整到了最前面,所以第三次可以读出文件的所有内容 - w+,写读【可读,可写】
#w+ f = open("ha.log",'w+',encoding="utf-8") data = f.read() #读第一次 print(type(data),data) print(f.tell()) #获取指针位置 f.write("意大利") print(f.tell()) #获取指针位置 data = f.read() #写后,第二次读 print(type(data),data) f.seek(0) #调整指针位置,到最前面 data = f.read() #第三次读 print(type(data),data) f.close() 输出结果: <class 'str'> 0 9 <class 'str'> <class 'str'> 意大利 #第一次读操作,没有读取到文件内容,说明 文件在执行w+操作的时候就把文件内容删除了
- x+,写读【可读,可写】
#x+ f = open("ha2.log",'a+',encoding="utf-8") data = f.read() #读第一次 print(type(data),data) print(f.tell()) #获取指针位置 f.write("意大利") print(f.tell()) #获取指针位置 data = f.read() #写后,第二次读 print(type(data),data) f.seek(0) #调整指针位置,到最前面 data = f.read() #第三次读 print(type(data),data) f.close() 输出结果: <class 'str'> 0 9 <class 'str'> <class 'str'> 意大利 #因为x+创建了新文件,所以没什么变化
- a+,写读【可读,可写】
#a+ f = open("ha.log",'a+',encoding="utf-8") data = f.read() #读第一次 print(type(data),data) print(f.tell()) #获取指针位置 f.write("意大利") print(f.tell()) #获取指针位置 data = f.read() #写后,第二次读 print(type(data),data) f.seek(0) #调整指针位置,到最前面 data = f.read() #第三次读 print(type(data),data) f.close() 输出结果: <class 'str'> 4 13 <class 'str'> <class 'str'> ciri意大利 #因为第一次没有读到内容,说明打开文件时,指针调整到了最后面(ciri是四个字节)
总结 # r+ -- 不进行写操作,不删除文件的内容 # W+ -- 在打开文件的时候,就清楚了文件内容 # a+ -- 在打开时指针调整到了最后面 # x+ -- 创建新文件
"b"表示以字节的方式操作
- rb 或 r+b
- wb 或 w+b
- xb 或 x+b
- ab 或 a+b
现有一个文件
文件名:ha.log 文件内容:ciri
#rb--只读 f = open("ha.log","rb") data = f.read() f.close() print(data) print(type(data)) str_data = str(data,encoding="utf-8") #把字节转换成字符串 print(str_data) #wb--只写 f = open("ha.log","wb") f.write(bytes("中国",encoding="utf-8")) #把字节转换成字符串,然后写入 f.close() #xb--只写 f = open("ha2.log","wb") f.write(bytes("中国",encoding="utf-8")) #把字节转换成字符串,然后写入 f.close() #ab--追加 f = open("ha1.log","ab") f.write(bytes("中国",encoding="utf-8")) #把字节转换成字符串,然后写入 f.close()
注:以b方式打开时,读取到的内容是字节类型,写入时也需要提供字节类型
二、操作文件
#close -- 关闭文件 #fileno -- 文件描述符,I/O操作时会用 #flush -- 刷新文件内部缓冲区,刷到硬盘 f1 = open("ha.log",'r+',encoding="utf-8") f1.write("I don't bite") i = input(">>>") #此时程序没有执行完,文件的内容不会变。当进程中止时,才会从内存刷到硬盘里 #此时是读取不到新的文件内容的 f1 = open("ha.log",'r+',encoding="utf-8") f1.write("I don't bite") f1.flush() #主动把内存里的东西刷到硬盘上,别的程序会读取到新的文件内容 i = input(">>>") #read -- 读取指定字节数据 f1.read()#不加参数读取所有的内容 f1.read(1)#以b的形式打开(读一个字节),以字符形式打开(读一个字符) #readable -- 是否可读 #readline -- 仅读取一行数据 f = open("ha.log",'r+',encoding="utf-8") for line in f: print(line) #一行一行的读取文件 #seek -- 指定文件中指针位置 #seekable -- 指针是否可操作 #tell -- 获取指针位置 #truncate -- 截断数据,仅保留指定之前数据 f1.truncate() #指针在哪就截取前面的几个 #write -- 写内容 #writeable -- 是否可写
三、关闭文件
自动close的操作——with
with open('','r') as f: f.read() 。。。
用with同时打开两个文件
with open('log1','r') as obj1 ,open('log2','r') as obj2: #例: with open('ha.log','r') as f1 ,open('ha12','r') as f2: with open('源文件','r') as obj1, open('新文件','w') as obj2: for line in '源文件': '新文件'.write(line) #一行一行的读取 源文件 ,然后复制到 新文件 里