python22期第三天(课程总结)
课程大纲:
1、编码
2、集合
3、深浅拷贝
4、文件操作
5、初识函数
1.编码:
# b1 = s1.encode('utf-8') # print(b1) b1 = b'alex' print(s1.capitalize()) print(b1.capitalize()) s1 = '中国' b1 = s1.encode('utf-8') print(b1) s1 = 'alex' # str ---> bytes encode 编码 b1 = s1.encode('utf-8') print(b1) #bytes---> str decode 解码 s2 = b1.decode('utf-8') print(s2) s1 = 'alex' b2 = s1.encode('gbk') s3 = b2.decode('gbk') print(b2) print(s3) s1 = 'alex' b1 = s1.encode('utf-8') s2 = b1.decode('gbk') print(s2) s4 = '中国' b4 = s4.encode('utf-8') print(b4) s5 = b4.decode('gbk') print(s5) s4 = '中国' b4 = s4.encode('utf-8') # utf-8 bytes print(b4) b6 = b4.decode('utf-8').encode('gbk') print(b6)
2.结合:
set1 = {'alex', 'wusir', 'taibai', 'alex'}
set2 = {'alex', 'wusir', 'taibai', 'alex',[1, 2, 3]}
print(set1)
print(set2)
列表的去重
set1 = {1,1,2,2,3,4,4,5}
l1 = [1, 1, 2, 2, 3, 4, 4, 5]
print(list(set(l1)))
set1 = {'alex', 'wusir', 'ritian', 'egon', 'barry'}
增
set1.add('文周')
print(set1)
set1.update('abc')
print(set1)
删
set1.pop() #随机删除
print(set1)
set1.remove('alex') # 按照元素删除
set1.remove('alex1') # 按照元素删除
print(set1)
set1.clear() #清空
print(set1) # set()
del set1
print(set1)
查
for i in set1:
print(i)
set1 = {1, 2, 3, 4, 5}
set2 = {4, 5, 6, 7, 8}
交集 & intersection
print(set1 & set2)
print(set1.intersection(set2))
并集 | union
print(set1 | set2)
print(set1.union(set2))
差集 - difference
print(set1 - set2)
print(set1.difference(set2))
print(set2 - set1)
反交集 ^ symmetric_difference
print(set1 ^ set2)
print(set1.symmetric_difference(set2))
子集
set1 = {1, 2, 3}
set2 = {1, 2, 3, 4, 5, 6}
print(set1 < set2)
print(set1.issubset(set2))
# 超集
# set1 = {1, 2, 3}
# set2 = {1, 2, 3, 4, 5, 6}
# print(set2 > set1)
# print(set2.issuperset(set1))
# set1 = {1, 2, 3}
# print(frozenset(set1))
3.深浅拷贝
s1 = [1, 2, 3] s2 = s1 # 共用一个 s1.append(666) print(s1, s2) s1 = [1, 2, 3] s2 = s1.copy() s1.append(666) print(s1, s2) s1 = [1, 2, 3,[11,22]] s2 = s1.copy() s1[-1].append(666) print(s1, s2) print(id(s1), id(s2)) print(id(s1[-1]), id(s2[-1])) # 浅copy 第一层各自独立,从第二层开始,共用一个内存地址。 # 深copy import copy s1 = [1, 2, 3,[11,22]] s2 = copy.deepcopy(s1) s1.append(666) print(s1, s2) s1 = [1, 2, 3,[11,22]] s2 = copy.deepcopy(s1) s1[-1].append(666) print(s1, s2) 深copy 无论多少层,都是互相独立的。 切片 浅copy s1 = [1, 2, 3, [11, 22]] s2 = s1[:] # s1.append(666) s1[-1].append(666) print(s1, s2)
4.文件操作
f1 = open(r'd:/嫂子护士联系方式.txt', encoding='gbk', mode='r') print(f1.read()) f1.close() f1 = open('log1', encoding='gbk', mode='r') print(f1.read()) f1.close() """ f1 文件句柄,f,file,file_hander,f_h.... open()调用的内置函数,内置函数调用的系统内部的open, 一切对文件进行的操作都是基于文件句柄f1. 执行流程: 1,打开文件,产生文件句柄。 2,对文件句柄进行操作。 3,关闭文件句柄。 """ 读 r 1 read() 全读出来 f1 = open('log1', encoding='utf-8') content = f1.read() print(content) f1.close() 2 read(n) 读一部分 f1 = open('log1', encoding='utf-8') content = f1.read(3) print(content) f1.close() f1 = open('log1', mode='rb') print(f1.read(3).decode('utf-8')) f1.close() r 模式 read(n) n 按照字符读取。 rb 模式 read(n) n 按照字节读取。 #3 readline() 按行读取 f1 = open('log1', encoding='utf-8') print(f1.readline()) print(f1.readline()) print(f1.readline()) f1.close() 4 readlines() f1 = open('log1', encoding='utf-8') print(f1.readlines()) f1.close() 5 for 循环 f1 = open('log1', encoding='utf-8') for line in f1: print(line) f1.close() f1 = open('1.jpg', mode='rb') print(f1.read()) f1.close() r+ 读写 先读后写 f1 = open('log1', encoding='utf-8', mode='r+') # print(f1.read()) # f1.write('666') f1.write('a') print(f1.read()) f1.close() 写:w w 没有文件,新建文件写入内容 有原文件,先清空内容,在写入新内容。 f1 = open('log2', encoding='utf-8', mode='w') f1.write('桃白白fdksagdfsa') f1.close() 图片的读取及写入 f1 = open('1.jpg', mode='rb') content = f1.read() f2 = open('2.jpg', mode='wb') f2.write(content) f1.close() f2.close() w+ 先写后读 f1 = open('log2', encoding='utf-8', mode='w+') f1.write('两款发动机了') f1.seek(0) print(f1.read()) f1.close() 追加 a a 没有文件,新建文件写入内容 f1 = open('log3', encoding='utf-8', mode='a') # f1.write('alex 666') f1.write('\nalex 666') f1.close() a+ f1 = open('log3', encoding='utf-8', mode='a+') f1.write('python22期') f1.seek(0) print(f1.read()) f1.close() 其他操作方法 readable 是否可读 writable 是否可写 f1.seek(12) # 任意调整 f1.seek(0,2) #光标调整到最后 f1.seek(0) #光标调整到开头 f1.tell() # 告诉光标的位置
5.初始函数
s = 'lkfjsjulkjdgjdsf' count = 0 for i in s: count += 1 print(count) l1 = [1, 2, 3, 4, 5, 6] count = 0 for i in l1: count += 1 print(count) 重复代码多。 可读性差。 s = 'lkfjsjulkjdgjdsf' print(len(s)) s = 'lkfjsjulkjdgjdsf' def my_len(): count = 0 for i in s: count += 1 # print(count) ''' def 关键字 函数名(): 函数体 函数执行:函数名() 函数:以功能为导向。 ''' # my_len() s = 'lkfjsjulkjdgjdsf' def my_len(): count = 0 for i in s: count += 1 print(my_len()) return 1,终止函数。 2,给函数的执行者返回值。 """ return 或者 return None return 单个值 return 多个值 会将多个值放到一个元组中,将元组返回个函数的执行者 """ def func1(): print(111) print(222) return print(333) func1() def func1(): print(111) print(222) return 666 return 'alex' return 'alex', 666, [1, 2, 3] ret = func1() print(ret,type(ret)) s = 'lkfjsjulkjdgjdsf' def my_len(): count = 0 for i in s: count += 1 return count print(my_len()) 函数的传参 def my_len(argv): # 形式参数 ,形参 count = 0 for i in argv: count += 1 return count s = 'lkfjsjulkjdgjdsf' l1 = [1, 2, 3, 4, 5] # my_len(s) # 实际参数, 实参 print(my_len(l1)) 实参角度 位置参数 按照顺序一一对应 def func1(a, b, c): print(a, b, c) func1(1, 2, 'alex') def max(a, b): return a if a > b else b ret = 1 if 2 > 1 else 6 print(ret) print(max(10, 2)) 关键字传参 一一对应。 def func2(a, b): print(a, b) func2(b=2, a=3) 混合参数。(位置参数,关键字参数) 关键字参数必须在位置参数后面。 def func3(a, b, c, d): print(a, b, c, d) func3(1,2,d=3,c=5) 形参角度 位置参数。按顺序一一对应。 def func1(a, b, c): print(a, b, c) func1(1, 2, 'alex') 默认参数。 默认参数在位置参数的后面。 def func1(): print(a, b, c) func1(1, 2, 'alex') def login(name,sex='男'): with open('register', encoding='utf-8', mode='a') as f1: f1.write('{},{}\n'.format(name,sex)) while True: name = input('请输入姓名:').strip() if '1' in name: login(name) else: sex = input('请输入性别:').strip() login(name,sex) 动态参数。 *args, **kwargs 万能参数。 args:所有的位置参数,放在一个元组中。 kwargs:所有的关键字参数,放在一个字典中。 def func3(*args, **kwargs): #函数的定义的时候 * 代表聚合。 print(args) print(kwargs) # func3(1, 2, 3, 'alex', c=6, name='wusir', age='21') # func3(*[1, 2, 3],*(22, 33)) #函数的执行的时候 * 代表打散。 func3(**{'name':"alex"},**{'age':23}) #函数的执行的时候 * 代表打散。 func3(1, 2, 3, 22, 33) #函数的执行的时候 * 代表打散。 形参的顺序 位置参数 *args, 默认参数,**kwargs def func5(a,b,*args,sex='男',**kwargs): print(a,b,) print(args) print(sex) print(kwargs)
函数的应用:
1.函数名可以作为容器类数据的元素
def func1(): print(111) def func2(): print(222) def func3(): print(333) l1 = [func1, func2, func3] for i in l1: i()
2.函数名可以作为函数的参数
def func1(): print(111) def func2(x): print(x) x() print(222) func2(func1)
3.函数名可以作为函数的返回
def func1():
return 111
def func2(x): # x = func1
print(222)
return x
ret = func2(func1) # func1
print(ret())
print(ret)
def func3(x):
print(x)
return x
# a = 2
# func1 = <function func1 at 0x000000000258F9D8>
func3(func1)
def func1():
print(1111)
return 111
f1 = func1
f2 = f1
f3 = f2
print(f3)
f3()
闭包函数:
闭包:内层函数对外层函数非全局变量的引用,就叫做闭包
def wrapper(): name = 'alex' def inner(): print(name) inner() wrapper() name = 'alex' def wrapper(): def inner(): print(name) inner() print(inner.__closure__) # None wrapper() 通过函数名.__closure__ name = 'alex' def wrapper(x): x = name def inner(): print(x) inner() print(inner.__closure__) # <cell at 0x0000000000130C48: str object at 0x0000000001E8A260> wrapper(name)
如果 python 解释器遇到了闭包,他有一个机制,
这个闭包不会随着函数的结束而释放。
from urllib.request import urlopen def index(): url = "http://www.xiaohua100.cn/index.html" def get(): return urlopen(url).read() return get
装饰器:
装饰器:简单例子:
import time print(time.time()) # 1527326532.2688255 def func1(): time.sleep(0.3) print('非常复杂......') start_time = time.time() func1() end_time = time.time() print('此函数的执行效率%s' %(end_time-start_time))
装饰器改版1:我要封装到一个函数中
def func1(): time.sleep(0.3) print('非常复杂......') def func2(): time.sleep(0.3) print('特别复杂......') func1() func2()
装饰器改版2:被测试函数当参数传入,可以测试多个函数的执行效率
def timmer(f): start_time = time.time() f() end_time = time.time() print('此函数的执行效率%s' %(end_time-start_time)) timmer(func1) timmer(func2)
装饰器改版3:测试函数执行效率的同时,不要改变原函数的调用方式
def func1(): time.sleep(0.3) print('非常复杂......') def func2(): time.sleep(0.3) print('特别复杂......') # func1() # func2() def timmer(f): start_time = time.time() f() end_time = time.time() print('此函数的执行效率%s' % (end_time - start_time)) f1 = func1 func1 = timmer # func1(f1) # timmer(func1)
装饰器改版4:改版3虽然大体上满足了我的要求,但是增加两行代码,而且多了参数,不好,继续改,尽量不添加其他代码,而且做到调用时一模一样,最简单的装饰器。
# 最简单的装饰器。 def func1(): time.sleep(0.3) print('非常复杂......') def func2(): time.sleep(0.3) print('特别复杂......') # func1() # func2() def timmer(f): # f = func1 函数名 def inner(): start_time = time.time() f() end_time = time.time() print('此函数的执行效率%s' % (end_time - start_time)) return inner func1 = timmer(func1) # inner func2 = timmer(func2) # inner func1() # inner() func2()
装饰器改版5:改版4每次测试一个函数的执行效率时,都需要加一行 func1 = timmer(func1)代码,麻烦python提出了一个语法糖 @。
def timmer(f): # f = func1 函数名 def inner(): start_time = time.time() f() end_time = time.time() print('此函数的执行效率%s' % (end_time - start_time)) return inner @timmer # func1 = timmer(func1) inner def func1(): time.sleep(0.3) print('非常复杂......') func1() # inner()
装饰器改版6:被装饰的函数肯定要有参数的,你现在不能满足,解决这个问题。被装饰的函数带参数的装饰器
def timmer(f): # f = func1 函数名 def inner(*args,**kwargs): # args = (1,2),kwargs {sex:'nv',name:'alex'} start_time = time.time() f(*args,**kwargs) # f(1,2,,sex='nv',name='alex') end_time = time.time() print('此函数的执行效率%s' % (end_time - start_time)) return inner @timmer # func1 = timmer(func1) inner def func1(a,b): time.sleep(0.3) print(a,b) print('非常复杂......') @timmer # func1 = timmer(func1) inner def func2(a,b,name,sex='man'): # f(1,2,,sex='nv',name='alex') time.sleep(0.3) print(a,b,sex,name) print('非常复杂......') func2(1,2,sex='nv',name='alex') # inner()
装饰器改版7:被装饰的函数肯定要有返回值的,解决这个问题。被装饰的函数带参数且有返回值的装饰器
def timmer(f): # f = func2 函数名 def inner(*args,**kwargs): # args = (1,2),kwargs {sex:'nv',name:'alex'} start_time = time.time() ret = f(*args,**kwargs) # f(1,2,,sex='nv',name='alex') end_time = time.time() print('此函数的执行效率%s' % (end_time - start_time)) return ret return inner @timmer # func1 = timmer(func1) inner def func2(a,b,name,sex='man'): # f(1,2,,sex='nv',name='alex') time.sleep(0.3) print(a,b,sex,name) print('非常复杂......') return 666 print(func2(1,2,sex='nv',name='alex')) # inner() def timmer(f): def inner(*args,**kwargs): start_time = time.time() ret = f(*args,**kwargs) end_time = time.time() print('此函数的执行效率%s' % (end_time - start_time)) return ret return inner @timmer def func2(a,b,name,sex='man'): time.sleep(0.3) print(a,b,sex,name) print('非常复杂......') return 666 ret1 = func2(1,2,sex='nv',name='alex') print(ret1) def wrapper(f): def inner(*args,**kwargs): """被装饰函数执行之前的操作""" ret = f(*args,**kwargs) """被装饰函数执行之后的操作""" return ret return inner # 装饰器 本质就是闭包 # 装饰器根本作用:在不影响原函数执行的基础上,增加一些额外的功能登录认证,打印日志等等。

浙公网安备 33010602011771号