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": "
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表达式:简便的表达简单的函数
- 内置函数
- 两道面试题记住