5.2.6 函数可以当作参数进行传递
def func(arg):
arg()
def ggg():
print(123)
func(ggg)#输出就结果为123
def func(arg):
v1 = arg()
print(v1)
def show():
print(666)
result = func(show)
print(result)
5.2.6 lambda表达式
-
用于表达就简单函数
# 三元运算,为了解决简单的if else的情况,如: if 1 == 1: a = 123 else: a = 456 a = 123 if 1 == 1 else 456 # lambda表达式,为了解决简单函数的情况,如: def func(a1,a2): return a1 + 100 func = lambda a1,a2: a1+100 #列表的所有方法基本上返回值都是none,字符串的所有方法都是返回新的值
练习题
# 练习题1
USER_LIST = []
def func0(x):
v = USER_LIST.append(x)
return v
result = func0('alex')
print(result)
# 练习题2
def func0(x):
v = x.strip()
return v
result = func0(' alex ')
print(result)
############## 总结:列表所有方法基本上都是返回None;字符串的所有方法基本上都是返回新值 #################
# 练习题3
USER_LIST = []
func1 = lambda x: USER_LIST.append(x)
v1 = func1('alex')
print(v1)
print(USER_LIST)
# 练习题4
func1 = lambda x: x.split('l')
v1 = func1('alex')
print(v1)
# 练习题5
func_list = [lambda x:x.strip(), lambda y:y+199,lambda x,y:x+y]
v1 = func_list[0]('alex ')
print(v1)
v2 = func_list[1](100)
print(v2)
v3 = func_list[2](1,2)
print(v3)
5.2.7 内置函数
-
内置函数
-
其他
- len
- open
- range
- id
- type
-
输入输出
- input
-
强制转换
- dict()
- list()
- tuple()
- int()
- str()
- bool()
- set()
-
pow
v = pow(2,3) print(v)
-
round
v = round(1.127,2) print(v)
-
-
编码相关
-
chr,将十进制数字转换成 unicode 编码中的对应字符串。
v = chr(99) print(v)
-
ord,根据字符在unicode编码中找到其对应的十进制。
num = ord('中')
-
应用:
import random def get_random_code(length=6): data = [] for i in range(length): v = random.randint(65,90) data.append(chr(v)) return ''.join(data) code = get_random_code() print(code)
import random # 导入一个模块 v = random.randint(起始,终止) # 得到一个随机数
-
-
高级一点的内置函数
-
map,循环每个元素(第二个参数),然后让每个元素执行函数(第一个参数),将每个函数执行的结果保存到新的列表中,并返回。
v1 = [11,22,33,44] result = map(lambda x:x+100,v1) print(list(result)) # 特殊
-
filter
v1 = [11,22,33,'asd',44,'xf'] def func(x): if type(x) == int: return True return False result = filter(func,v1) # [11,] print(list(result)) result = filter(lambda x: True if type(x) == int else False ,v1) print(list(result)) result = filter(lambda x: type(x) == int ,v1) print(list(result))
-
reduce
import functools v1 = ['wo','hao','e'] def func(x,y): return x+y result = functools.reduce(func,v1) print(result) result = functools.reduce(lambda x,y:x+y,v1) print(result)
-
-
-
数学相关
-
abs,绝对值
v = abs(-1) print(v)#得到1,求出数字的绝对值
-
float,转换成浮点型(小数)
v = 55 v1 = float(55) print(v1)
-
max,找到最大值
v = [1,2,311,21,3,] result = max(v) print(result)#输出311找到最大值
-
min,找最小值
v = [1,2,311,21,3,] result = min(v) print(result)
-
sum,求和
v = [1,2,311,21,3,] result = sum(v) print(result)#求和
-
divmod,两数相除的商和余数
a,b = divmod(1001,5) print(a,b)
# 练习题 请通过分页对数据进行展示 """ 要求: 每页显示10条数据 让用户输入要查看的页面:页码 """ USER_LIST = [] for i in range(1,836): temp = {'name':'你少妻-%s' %i,'email':'123%s@qq.com' %i } USER_LIST.append(temp) # 数据总条数 total_count = len(USER_LIST) # 每页显示10条 per_page_count= 10 # 总页码数 max_page_num,a = divmod(total_count,per_page_count) if a>0: max_page_num += 1 while True: pager = int(input('要查看第几页:')) if pager < 1 or pager > max_page_num: print('页码不合法,必须是 1 ~ %s' %max_page_num ) else: """ # 第1页:USER_LIST[0:10] -> 0123456789 # 第2页:USER_LIST[10:20] # 第3页:USER_LIST[20:30] ... """ start = (pager-1) * per_page_count end = pager * per_page_count data = USER_LIST[start:end] for item in data: print(item)
-
-
进制转换相关
-
bin,将十进制转化成二进制
num = 13 v1 = bin(num) print(v1)
-
oct,将十进制转换成八进制
num = 8 v1 = oct(num) print(v1)
-
int,将其他进制转化成十进制
# 二进制转化成十进制 v1 = '0b1101' result = int(v1,base=2) print(result) # 八进制转化成十进制 v1 = '0o1101' result = int(v1,base=8) print(result) # 十六进制转化成十进制 v1 = '0x1101' result = int(v1,base=16) print(result)
-
hex,将十进制转换成十六进制
num = 16 v1 = hex(num) print(v1)
-
5.2.8 函数中高级
5.2.8.1 函数可以作为返回值
def f():
print(123)
def b():
return f
v = b()#v就是f函数
v()#执行f函数
5.2.8.2 闭包
-
闭包应用场景:装饰器,sqlaeilde源码中
-
闭包的概念:为函数创建一块区域,并维护自己数据,以便以后调用
def cf(): def tm(): print("123")#内层函数需要使用才叫一个闭包 return tm c = cf()#内存地址会保留这次数据的函数执行,到使用c()把tm函数执行使用后内存才会销毁
5.2.8.3 递归
-
递归(默认python递归最大递归次数1000次)
def func():#死循环实例 print(1) func() func() ################################################### def func(a,b):#斐波那契数列,递归实现方法 if a ==5: return 500000 print(b) func(b,a+b) func(0,1)
-
用这个模块就可以查看递归次数
-
递归效率不高,尽量减少用递归。用while代替
# 递归的返回值 def func(a): if a == 5: return 100000 result = func(a+1) + 10 v = func(1) name = 'alex' def func(): def inner(): print(name) return inner v =func()
5.3 推导式&装饰器
5.3.1 装饰器
- 在不改变原函数代码的前提下,让函数在之前之后做些操作
- 装饰器准则:
- 变量的赋值
- 看看return的是什么
- 自己没有去上级作用域找
def func():
pass
v = func
v()
######################################################
def base():
print(1)
pass
def bar():
print(2)
pass
base = bar
base()#执行bar函数
#####################################################
重点:(记住格式以及执行原理)
def func(arg):
def iner():
mun = arg()
print(mun)
return mun
return iner
@func#执行func函数并把下面参数传递相当于func(index),将func的返回值重新赋值给下面的函数名相当于index = func(index)
def index():
print(123)
return 666
index()
def x(func):
def inner(a1,a2):
return func(a1,a2)
return inner
@x
def index(a1,a2):
pass
# index = inner
index(1,2)
# ################################### 参数统一的目的是为了给原来的index函数传参
def x(func):
def inner(a1,a2):
return func()
return inner
@x
def index():
pass
# func = 原来的index函数u
# index = inner
index(1,2)
-
装饰器应用
# 计算函数执行时间 def wrapper(func): def inner(): start_time = time.time() v = func() end_time = time.time() print(end_time-start_time) return v return inner @wrapper def func1(): time.sleep(2) print(123) @wrapper def func2(): time.sleep(1) print(123) def func3(): time.sleep(1.5) print(123) func1()
-
装饰器应用场景:想要为函数拓展功能时,可以选择用装饰器
装饰器编写格式 def func(参数): def iner(*args,**kwargs): mun = arg(*args,**kwargs) return 参数() return iner内层函数
-
装饰器应用格式
@外层函数 def index(): print(123) return 666 使用函数index()
-
带参数的装饰器场景:常见在flask框架中,让装饰器实现函数要执行N次
-
关于参数
-
关于返回值
5.3.1.1 带参数的装饰器
-
带参数的装饰器实例:
def x(counter):#实现效果@x几次输入几次执行,并返回结果以列表呈现 def wad(func): def inte(*args,**kwargs): a = [] for i in range(counter): e = func(*args,**kwargs) a.append(e) return a return inte return wad @x(10) def gg(c): print(c)
5.3.2 推导式
-
列表推导式
-
基本格式
目的方便的生成一个列表 方式一 vp = [i for i in "alex"#可迭代对象] print(vp)#输出["a","l","e","x"] 方式二 vp = [i+100 for i in range(5)] print(vp)#输出[100,101,102,103,104]
""" 目的:方便的生成一个列表。 格式: v1 = [i for i in 可迭代对象 ] v2 = [i for i in 可迭代对象 if 条件 ] # 条件为true才进行append """ v1 = [ i for i in 'alex' ] v2 = [i+100 for i in range(10)] v3 = [99 if i>5 else 66 for i in range(10)] def func(): return 100 v4 = [func for i in range(10)] v5 = [lambda : 100 for i in range(10)] result = v5[9]() def func(): return i v6 = [func for i in range(10)] result = v6[5]() v7 = [lambda :i for i in range(10)] result = v7[5]() v8 = [lambda x:x*i for i in range(10)] # 新浪微博面试题 # 1.请问 v8 是什么? # 2.请问 v8[0](2) 的结果是什么? # 面试题 def num(): return [lambda x:i*x for i in range(4)] # num() -> [函数,函数,函数,函数] print([ m(2) for m in num() ]) # [6,6,6,6] # ##################### 筛选 ######################### v9 = [i for i in range(10) if i > 5]
-
-
集合推导式
-
基本格式
vp = set(i for in "alex")
-
-
字典推导式
v1 = {"k"+str(i):i for i in range(10)}