python22期第五天 内容总结 (内置函数)
课程大纲:
1.函数的有效信息
2.可迭代对象--迭代器
3.生成器-列表生成器-生成器表达式
4.列表推导式
5.内置函数
一:函数的有效信息:
例子:
from functools import wraps def logger(f): @wraps(f) def inner(*args, **kwargs): """ :param args: 函数名,密码 :param kwargs: 备用 :return: True """ ret = f(*args, **kwargs) return ret return inner @logger def login(username,password): """ 此函数是完成登录功能的函数,需要用户名,和密码两个参数,返回True 登陆成功 :return: True """ print(666) return True # login(1,2) #inner() # # login('alex', 123) print(login.__doc__) print(login.__name__)
二:迭代对象:
可迭代对象类型:str, list tuple dict set range 文件句柄
判断可迭代对象:
该对象中,含有__iter__方法的就是可迭代对象,遵循可迭代协议。
print(dir(str))
第一种方法:
1,判断该对象是不是可迭代对象 '__iter__' in dir(对象)
print('__iter__' in dir(str))
print('__iter__' in dir(list))
2,判断该对象是不是可迭代对象 isinstance('abc',Iterable)
from collections import Iterable
# print(isinstance('abc',Iterable))
# print(isinstance('abc',str))
迭代器 内部含有__iter__ 且含有__next__方法的对象就是迭代器,遵循迭代器协议。
s1 = 'abc'
# obj_s = s1.__iter__() # 可迭代对象转化成迭代器
# obj_s = iter(s1) # 可迭代对象转化成迭代器
# print(obj_s) # <str_iterator object at 0x0000000001F4A128>
# print(obj_s.__next__())
# print(obj_s.__next__())
# print(obj_s.__next__())
# print(obj_s.__next__())
判断该对象是不是迭代器:
s1 = 'abc'
print('__iter__' in dir(s1))
print('__next__' in dir(s1))
判断该对象是不是可迭代器
from collections import Iterator
l1 = [1,2,3]
print(isinstance(l1,Iterator))
l1_obj = l1.__iter__()
print(isinstance(l1_obj,Iterator))
迭代器的好处
1,节省内存
2,惰性机制
3,单向执行,不可逆。
备注:迭代器走完最后一个会报错,需要try来捕捉报错,是的程序不反悔错误
例子:
s1 = 'fkdsafhdskfhsdklfjdslfksd' s1_obj = s1.__iter__() while True: try: print(s1_obj.__next__()) except StopIteration: break
三:生成器:
概念:生成器本质就是迭代器,他是自定义的迭代器(自己用python代码写的迭代器)
例子1:函数方式构建一个生成器
def func1(): print(111) yield 666 g_obj = func1() # 生成器对象 # print(g_obj) # <generator object func1 at 0x0000000001E21E60> # 凡事函数中见到yield 他就是生成器 print(g_obj.__next__())
例子2:
def func1(): # print(111) yield 666 print(222) print(333) yield 'alex' print(888) g_obj = func1() # 生成器对象 #__next__() 和 yield 必须一一对应 print(g_obj.__next__()) print(g_obj.__next__()) print(g_obj.__next__())
例子3:
def cloth1(): for i in range(1,5001): yield '衣服%s' %i g_obj = cloth1() # 生成器对象 for i in range(50): print(g_obj.__next__()) for i in range(150): print(g_obj.__next__())
例子4:
def func1(): count = yield 666 print(count) yield 'alex' yield 'abc' g_obj = func1() # 生成器对象 print(g_obj.__next__()) print(g_obj.__next__()) send 和next 都是对生成器取值。 send 会给上一个yield 发送一个值。 send 不能用在第一次取值。 最后一个yield 不能得到值 print(g_obj.send('taibai')) print(g_obj.send('taibai')) print(g_obj.__next__())
四:列表推导式:
讲一个简单的否循环写成列表推导式:
例子1:
l1 = [] for i in range(1,23): l1.append('python%s期' % i) print(l1) l = [i for i in range(1,11)] # [变量(加工后的变量) for 变量 in iterable] 遍历模式 # print(l) l2 = ['python%s期' % i for i in range(1,23)] print(l2) [变量(加工后的变量) for 变量 in iterable] 遍历模式
例子2:
[变量(加工后的变量) for 变量 in iterable] 遍历模式 [变量(加工后的变量) for 变量 in iterable if 条件] 筛选模式 l2 = [i for i in range(1,31) if i % 3 == 0] print(l2) l2_obj = (i for i in range(1,31) if i % 3 == 0) print(l2_obj) for i in l2_obj: print(i) print(l2)
列表推导式的特点:
列表推导式:简单,一行搞定。
特别复杂的数据列表推导式无法实现,只能用其他方式实现。
列表推导式不能排错。
列表推导式与生成器表达式区别
1 ,列推直观能看出,但是占内存
2,生成器表达式不易看出,但是节省内存。
五:内置函数:
1.作用域相关:
locals golbals 1.2其他相关 1.2.1 ***eval exec print(eval('1 + 2 +3')) print(eval("{'name':'alex'}"),type(eval("{'name':'alex'}"))) exec:执行字符串类型的代码。 print(exec('1 +2 +3')) s1 = ''' for i in range(5): print(i) ''' print(exec(s1))
1.2:compile:将字符串类型的代码编译。代码对象能够通过exec语句来执行或者eval()进行求值。
1.2.2 输入输出相关 ***input,print print(1, 2, 3, sep='****') # 分隔符 print(1111,end='') # 换行 print(222) with open('练习',encoding='utf-8', mode='w') as f1: print('今天天气还可以',file=f1)
1.3 :*hash:获取一个对象(可哈希对象:int,str,Bool,tuple)的哈希值。
# print(hash('alex')) # print(hash('alex1')) # print(hash((1,2,3))) # print(hash(10)) # print(hash(99)) # print(hash(True))
1.4:** 调用相关:** callable:函数用于检查一个对象是否是可调用的。如果返回True,object仍然可能调用失败;但如果返回False,调用对象ojbect绝对不会成功。
name = 'alex' def func1(): print(111) print(callable(name)) print(callable(func1))
1.5 :基础数据类型相关
数字相关:
数据类型(4): bool :用于将给定参数转换为布尔类型,如果没有参数,返回 False。 int:函数用于将一个字符串或数字转换为整型。 **int:函数用于将一个字符串或数字转换为整型。 print(int()) # 0 print(int('12')) # 12 print(int(3.6)) # 3 *float:函数用于将整数和字符串转换成浮点数。 i = 2.456 print(i,type(i)) print(float(1.1))
1.6 进制转换:
进制转换(3):* bin:将十进制转换成二进制并返回。 oct:将十进制转化成八进制字符串并返回。 hex:将十进制转化成十六进制字符串并返回。 print(bin(19)) print(oct(9)) print(hex(15))
1.7 数学运算:
# bs:函数返回数字的绝对值。 # print(abs(-1.2)) # *** divmod:计算除数与被除数的结果, # 返回一个包含商和余数的元组(a // b, a % b)。 # print(divmod(100,7)) # (商,余数) # *round:保留浮点数的小数位数,默认保留整数。 # print(round(3.43543656,4)) # *pow:求x**y次幂。(三个参数为x**y的结果对z取余) # print(pow(2,3)) # print(pow(2, 3, 3)) # *** sum:对可迭代对象进行求和计算(可设置初始值)。 l1 = [i for i in range(100)] # print(sum(l1)) # print(sum(l1,100)) l2 = [2, 5, 6, -7] # ***min:返回可迭代对象的最小值(可加key,key为函数名, # 通过函数的规则,返回最小值)。 # print(min(l2)) # print(min(l2,key=abs)) # *** max:返回可迭代对象的最大值(可加key,key为函数名,通过函数的规则,返回最大值)。 # print(max(l2,key=abs)) # reversed:将一个序列翻转,并返回此翻转序列的迭代器。 l3 = [2, 3, 9, 8, 7, 4] # l3.reverse() # print(l3) # l_obj = reversed(l3) # # print(l_obj) # for i in l_obj: # print(i)
1.8 * slice:构造一个切片对象,用于列表的切片。
l3 = [2, 3, 9, 8, 7, 4] rule = slice(0,3) print(l3[rule])
1.9 * format 科学计算
print(format('test', '<30')) print(format('test', '>20')) print(format('test', '^20'))
1.10:bytes 将unicode 转化成bytes
s = 'alex' b1 = s.encode('utf-8') print(b1) print(bytes(s, encoding='utf-8'))
1.11:***map:会根据提供的函数对指定序列做映射。返回的是迭代器
def square(x): return x ** 2 print(map(square, [1,2,3,4,5]) ) for i in map(square, [1,2,3,4,5]): print(i) print((i**2 for i in [1,2,3,4,5]))
1.12 :sorted:对所有可迭代的对象进行排序操作。
ll = sorted(l3) print(ll) sorted() def func(x): return x[1] L = [('a', 3), ('d', 4), ('b', 2), ('c', 1), ] print(sorted(L, key=func))
1.13:*** enumerate:枚举,返回一个枚举对象。
l1 = ['alex', 'laonanhai', 'taibai'] for index,content in enumerate(l1): print(index,content) for index,content in enumerate(l1,10): print(index,content)
1.14:map:会根据提供的函数对指定序列做映射。返回的是迭代器
def square(x): return x ** 2 print(map(square, [1,2,3,4,5]) ) for i in map(square, [1,2,3,4,5]): print(i) print((i**2 for i in [1,2,3,4,5]))
1.15:匿名函数:
def func(x,y): return x + y print(func(3,4)) func1 = lambda x,y: x + y print(func1(3,4)) def func1(x): return x**2 res = map(lambda x: x**2,[1,5,7,4,8]) for i in res: print(i)

浙公网安备 33010602011771号