python笔记(10)--高阶函数、lambda函数和内置函数
Day 11
今日内容:
- 函数小高级
- lambda表达式
- 内置函数
内容回顾:
-
函数基本结构
-
参数
- 形参
- 基本参数:
- 默认值参数:def func(a1,a2=123):pass
- 注意:默认值如果是不可变类型,随便用;如果是可变类型,有问题
- 万能参数:*args **kwargs
- 实参
- 位置传参
- 关键字传参
- 形参
-
返回值
-
默认返回:None
-
特殊情况
def func(): return 1,2,3,4
-
-
作用域
-
全局和局部
-
优先使用自己局部作用域,再使用全局作用域
-
子作用域只能读取或修改父级的值,不能重新赋值
-
global和nonlocal的区别
-
-
函数的嵌套
内容详细:
1.函数小高级
函数当做变量来使用
- 列表中也可以放函数;集合中也可放函数;字典中也可用values做函数,不建议键使用函数
注意:
- 函数执行中如有变量接收函数,必须有返回值或None
- 函数执行中没有变量接收函数,则没有任何返回值
def func():
print(123)
FUNC_LIST=[func,func,func]
FUNC_LIST[0]() #123
FUNC_LIST[1]() #123
FUNC_LIST[2]() #123
for item in FUNC_LIST:
item() #123 \n 123 \n 123
v=item()
print(v) #123 None 123 None 123 None
###列表中也可以放函数,集合中也可放函数,字典中也可用values做函数
def func():
print(123)
def bar():
print(666)
FUNC_LIST={"k1":func,"k2":bar}
FUNC_LIST["k1"]() #结果为123
函数当做参数进行传递
def func(arg):
arg()
def bar():
print(666)
func(bar) #结果为666
############################
def func(arg):
v1=arg()
print(v1)
def bar():
print(666)
func(bar) #结果为666 None
############################
def func(arg):
v1=arg()
print(v1)
def bar():
print(666)
result = func(bar)
print(result) #结果为666 None None
###########################
def func(arg):
print(777)
v1=arg()
print(v1)
def bar():
print(666)
v2 = func(bar)#详解:首先执行等号右边的,func(bar),把函数名称bar作为参数传入到func()函数中,此时arg=bar,则func(arg)函数变为:
#def func(bar):
# print(777) #第一步打印777
# v1=bar() #第二步,先算等号右边的,执行bar(),输出666,返回值为None,赋值给v1
# print(v1) #第三步,打印None
#此时返回func(bar)的返回值为None,赋值给v2
print(v2) #第四步,打印None
#结果为:
777
666
None
None
练习题:choice选择
def func1():
print("语音助手")
def func2():
print("文件助手")
def func3():
print("人工服务")
def func4():
print("业务助手")
def func5():
print("贷款助手")
info = {
"f1":func1,
"f2":func2,
"f3":func3,
"f4":func4,
"f5":func5
}
while True:
choice = input("请输入要选择的功能:").strip()
function_name = info.get(choice)
if function_name:
function_name()
break
else:
print("输入错误")
continue
2.lambda表达式
-
用于表示简单的函数,默认return冒号后面的内容
-
lambda函数中不能自己创建变量,只能使用父级变量
#三元运算,为了解决简单的if..else的情况,如 if a == 1: flag = True else: flag = False #三元运算表达式: flag =True if a == 1 else False #lambda表达式,为了解决简单函数的情况,如: def func(a1,a2): return a1 + a2 #lambda表达式: func = lambda a1,a2:a1 + a2 v = func(1,2) print(v) #结果为3
func1 = lambda : 100 #没有参数,并return 100 func2 = lambda a1:a1*100 #参数为a1,return a1*100 func3 = lambda *args,*kwargs:len(args)+len(kwargs) #参数为任意值,计算两个的长度
DATA = 100 def func(): DATA = 1000 bar = lambda a1:a1 + DATA v = bar(1) print(v) func() #结果为1001,lambda不能定义变量,只能从父级找
lambda与三元运算结合
#传统的写法
def func(n1,n2):
if n1 > n2:
print(n1)
else:
print(n2)
# 简写:lambda + 三元运算写法
func = lambda n1,n2:n1 if n1>n2 else n2
v = func(1,222)
print(v)
练习题:
- 列表中所有方法的返回值基本都是None
- 字符串所有方法基本上都是返回新值
#下面代码结果是什么
USER_LIST = []
func = lambda v:USER_LIST.append(v)
item = func("yanan")
print(item) #结果为None
print(USER_LIST) #结果为['yanan']
#列表中所有方法的返回值基本都是None
func_list = [lambda x:x.strip(),lambda y:y + 100,lambda z,x:z+x]
v1 = func_list[0](" alec")
print(v1) #结果为alec
v2 = func_list[1](10)
print(v2) #结果为110
v3 = func_list[2](8,2)
print(v3) #结果为10
3.内置函数
-
自定义函数
-
内置函数
数学相关:
-
abs():取绝对值
v = abs(-1) print(v) #结果为1
-
float,转换为浮点型(小数)
v = 55 v1 = float(v) print(v1) #结果为55.0
-
max(),取变量中最大值
v = [11,22,33,555,777] result = max(v) print(result) #取列表中最大值
-
min(),取变量中最小值
v = [11,22,33,555,777] result = min(v) print(result) #取列表中最小值
-
sum(),求和
v = [11,22,33,555,777] result = sum(v) print(result) #取列表中所有数值相加
-
divmod(),两数相除的商和余数
result = divmod(1001,5) print(result) #结果为(200,1) #也可以用两个数接收 a,b = divmod(1001,5) c = a+b print(a,b,c) #结果为200,1,201
进制转换相关:
-
bin,将十进制转换为二进制
num = 13 v = bin(num) print(v)
-
oct,将十进制转换为八进制
num = 13 v = oct(num) print(v)
-
int,将其他的进制转换为十进制
- 除十进制以外,其他进制进行互相转换时,可先转为十进制再转换为目标进制
#二进制转换为十进制: v1 = '0b1101' result = int(v1,base=2) print(result) #结果为13 #八进制转换为十进制: v1 = '0o1101' result = int(v1,base=8) print(result) #结果为577 #十六进制转换为十进制: v1 = '0x1101' result = int(v1,base=16) print(result) #结果为4353
-
hex,将其他的进制转换为十六进制
num = 13 v = hex(num) print(v)
练习题:
-
-
将IP地址中每个十进制数转换成二进制并通过","连接起来生成一个新的字符串。
ip = "192.168.155.9" ip_list = ip.split(".") # print(ip_list) info = [] for item in ip_list: info.append(bin(int(item))) print(",".join(info)) #结果为0b11000000,0b10101000,0b10011011,0b1001
-
二进制面试题:(本节重点)
#将IP地址中每个十进制数转换成二进制连接起来,生成一个新的二进制,再转为十进制输出 #注意:每个数字都将为8位字节,0b只能在开头,后续每段由八位0 1组成。格式为:0b11000000110000001100000011000000 ip = "192.16.18.2" #以点分割成每个元素加入到列表中 ip_list = ip.split(".") #新建空列表,循环每个ip_list元素 info = [] for item in ip_list: #十进制转为二进制 item = bin(int(item)) #除前两位后全取出来 data = item[2:] #判断“0b”后面是否有八位 if len(data) == 8: info.append(data) else: #如果不够就在前面加0,直到满足八位 num = 8 - len(data) new_num = num * "0" + "1" message = data.replace("1", new_num, 1) info.append(message) #把得到的列表转变为一个字符串,前面加“0b”,然后二进制转十进制 new_data = int("0b"+"".join(info),base=2) print(new_data)
-
面试题:通过分页对数据进行展示(本节重点)
''' 通过分页对数据进行展示 要求: 每页显示10条数据; 让用户输入要查看的页面:页码 ''' USER_LIST = [] for i in range(1, 852): temp = {"yanan": "alec-%s" % i, "emil": "506965776@qq.com-%s" % i} USER_LIST.append(temp) # 总数据量 list_num = len(USER_LIST) # 每页显示的数据 par_num = int(input("请输入每页要展示的数据:")) # 总页码数 max_num, a = divmod(list_num, par_num) if a >= 1: max_num += 1 while True: # 用户输入页码 pager = int(input("页码范围在1-%s,请输入第几页:" % max_num)) if pager < 1 or pager > max_num: print("请重新输入,页码范围在1-%s" % max_num) else: end = pager * par_num start = end - par_num data = USER_LIST[start:end] for item in data: print(item)
本章总结:
- 函数当做是一个变量:参数传值 / 当元素嵌套到字典列表中。(本章重点)
- lambda表达式:简便的表达简单的函数
- 内置函数
- 两道面试题记住