Python旅途——函数的应用、lambda函数、内置函数、闭包
Python——函数的应用、lambda表达式、内置函数
今天主要分享函数的一般的应用场景,这里给大家分为初级一些的应用场景,以及高级的应用场景。还有一种特殊的函数形式——lambda表达式
1.函数的初级应用场景
之前我们学过了很多的数据类型,其中容器类型的有集合、字典、列表等,而函数也可以作为元素放进这些容器类型的数据类型
-
函数可以放在集合里,也可以放在字典里,在字典中的时候一般作为字典的值
def func(): print(123) def bar(): print(666) info = {'k1': func, 'k2': bar} info['k1']() info['k2']()
-
函数名当变量来使用
def func(): print(1,2,3) x = func() print(x) lis = [func(),func(),func()] print(lis)
def func(): print(123) func_list = [func, func, func] # func_list[0]() # func_list[1]() # func_list[2]() for item in func_list: v = item() print(v) # 123 None 123 None 123 None
def func(): print(123) def bar(): print(666) info = {'k1': func, 'k2': bar} info['k1']() info['k2']() # 123 666
混淆:
def func(): return 123 func_list1 = [func,func,func] func_list2 = [func(),func(),func()] print(func_list1) # [<function func at 0x000002C1829BBA60>, <function func at 0x000002C1829BBA60>, <function func at 0x000002C1829BBA60>] print(func_list2) #[123, 123, 123]
-
函数可以当参数进行传递
def func(arg): v1 = arg() print(v1) def show(): print(666) func(show) # 666 None
def func(arg): v1 = arg() print(v1) def show(): print(666) result = func(show) print(result) #666 None None
2.函数的lambda表达式
-
lambda表达式是用来表达简单的函数,默认有返回值return
def func(a1,a2): return a1+a2 func2 = lambda a1,a2:a1+a2 v = func2(1,2) # 以上的两种写法是完全等价的
-
输入两个数,比较大小,返回大的那个
func5 = lambda a,b:a if a>b else b #输入两个数,返回其中大的数字 v = func5(3,4)
3.内置函数
-
内置函数
- len:取长度
- open:文件操作
- range:范围
- id:判断id
- type:判断类型
-
输入输出
- input
-
强制转换
- dict():转字典
- list():转列表
- tuple():转元组
- str():转字符串
- int():转数字
- set():转集合
- bool():转布尔
-
数字相关
-
abs() : 绝对值
v = abs(-1) print(v)
-
float() :浮点型(小数)
v = 55 v1 = float(55) print(v1)
-
max() :最大值
v = [1,2,311,21,3,] result = max(v) print(result)
-
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条数据 让用户输入要查看的页面:页码 """ lis = [] for i in range(1,845): info = {'name':'大栗%s'%i,'age':'1%s'%i} lis.append(info) per_page= 10 total_data = 845 page,other = divmod(total_data,per_page) if other != 0: page += 1 # 1 0-10 # 2 10-20 # 3 20-30 while True: message = input('请输入页数:') message = int(message) if message>845 or message<1: print('错误') else : start_position = (message-1)*per_page end_position = message*per_page data = lis[start_position:end_position] print(data) for item in data: print(item)
LIS = [] for i in range(1,934): info = {'name':'小猪%s'%i,'hobby':'睡觉%s'%i} LIS.append(info) how_many = 7 hole_length = len(LIS) print(hole_length) hole_length,rest = divmod(hole_length,how_many) if rest != 0: hole_length += 1 # 1 0,7 #2 7,14 #3 14,21 #4 21,28 while True: message = input("请输入") message = int(message) if message>hole_length or message<1: print('输入有误,请在范围内输入;') else: start_location =(message-1)*how_many end_location = message*how_many total = LIS[start_location:end_location] for line in total: print(line) """
-
-
编码相关
-
chr :将十进制转化为Unicode编码中对应的字符串
v = chr(99) print(v)
-
ord :将Unicode编码中对应的字符串找到并转化为其对应的十进制
num = ord('中')
# 应用 # 随机验证码 import random def get_random_code(length = 6): LIS = [] for i in range(length): v = random.randint(65,90) LIS.append(chr(v)) var = "".join(LIS) return var v1 = get_random_code(7) print(v1)
import random # 导入一个模块 v = random.randint(起始,终止) # 得到一个随机数
-
-
高级一点的内置函数
-
map:循环每个元素(第二个参数),然后让每个元素执行函数(第一个参数),将每个函数执行的结果保存到新的列表里并返回。(有返回值)
v1 = [11,22,33,44] result = map(lambda x:x+100,v1) print(list(result)) # 特殊 # 每个数乘以10 v1 = [12,34,45,23] var = map(lambda x:x*10,v1) print(list(var))
-
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)
-
面试题:
-
常用的内置函数有哪些?
-
filter/map/reduce是什么意思?
-
什么是匿名函数?
-
-
进制转换相关
-
bin:将十进制转换为二进制
num = 13 v1 = bin(num) print(v1)
-
oct:将十进制转换为八进制
num = 13 v1 = oct(num) print(v1)
-
int:将十进制转换为十进制
num = 13 v1 = int(num) print(v1)
-
hex:将十进制转换为十六进制
num = 13 v1 = hex(num) print(v1)
-
二进制转换为十进制
v1 = "0b1101" result = int(v1,base = 2) print(result)
-
二进制转换为八进制
v1 = "0o1101" result = int(v1,base = 2) print(result)
-
二进制转换为十六进制
v1 = "0x1101" result = int(v1,base = 2) print(result)
-
ip地址转换成二进制数(面试)
# 1字节等于8位 # IP: 192.168.12.79 -> 001010010 . 001010010 . 001010010 . 001010010 # 1. 请将 ip = "192.168.12.79" 中的每个十进制数转换成二进制并通过,连接起来生成一个新的字符串。 # 简单版——假面试 lis = [] ip = "192.168.12.79" var = ip.split(".") for i in var: new_i = int(i) x = bin(new_i) lis.append(x) result = ",".join(lis) print(result) # 加强版——真面试 lis = [] ip = "192.168.12.79" a = ip.split(".") for i in a: new_i = int(i) var = bin(new_i) var = var[2:] if len(var) != 8: var = var.rjust(8,'0') lis.append(var) x = "".join(lis) print(int(x,base=2))
4.函数的高级应用场景
-
函数内部执行相互之间不会混乱,执行完毕+内部元素不被其他人使用
-
函数可以做返回值进行返回
def func(): print(123) def bar(): return func # bar函数加括号执行经过return返回给v,此时v为func函数,但是并没有执行 v = bar() # v加括号,执行func函数 v()
def bar(): def inner(): print(123) return inner # bar函数加括号执行,将inner函数加载到内存,但是没有执行,返回inner函数 v = bar() # 此时的v为inner函数,加括号执行 v()
-
函数的变量位置问题
# 此时全局变量name为大栗 name = '大栗子' def bar(): name = '小栗子' def inner(): print(name) return inner # bar函数加括号执行时,将name=大栗子修改成了name=小栗子,并保存到内存 v = bar() # 此时v为inner函数,执行打印name为小栗子 v()
# 再来看一个 name = '糖炒栗子' def bar(name): def inner(): print(name) return inner v1 = bar('大栗') # { name=alex, inner } # 闭包,为函数创建一块区域(内部变量供自己使用),为他以后执行提供数据。 v2 = bar('小栗') # { name=eric, inner } v1() v2() # 打印的name分别为大栗、小栗
-
带闭包、传参的面试题
# 简单版面试题 info = [] def func(): print(item) # 此时的for循环已经结束,在内存地址中的item已经为9 for item in range(10): info.append(func) info[0]() # 9 # 加强版 info = [] def func(i): def inner(): print(i) return inner # 循环的时候,把每个item封装到了内存地址,为后面的使用进行保留(闭包) for item in range(10): info.append(func(item)) # 0 1 4 info[0]() info[1]() info[4]()
-
闭包:为函数创建一块区域(内部变量供自己使用),为以后的执行提供数据
def func(name): def inner(): print(name) return inner v1 = func('alex') v1() v2 = func('eric') v2()
-
注:函数何时被创建,进而判断将变量保存到了内存地址
-
高阶函数:把函数当做参数传递、把函数当做返回值
-
总结:函数执行的流程分析
- 闭包的概念:为函数创建一个区域并为其维护自己的数据,以后执行时方便调用
- 应用场景:装饰器、SQLAlchemy源码
今天主要分享了函数的一些简单的应用、高级的应用、传参、lambda函数的简单使用,以及函数的相对高级的概念,什么是闭包,这些都是我们以后再敲代码的时候需要牢牢掌握的。