Day 11

今日内容:

  • 函数小高级
  • lambda表达式
  • 内置函数

内容回顾:

  1. 函数基本结构
  2. 参数
  • 形参
  • 基本参数:
  • 默认值参数:def func(a1,a2=123):pass
  • 注意:默认值如果是不可变类型,随便用;如果是可变类型,有问题
  • 万能参数:*args **kwargs
  • 实参
  • 位置传参
  • 关键字传参
  1. 返回值
  • 默认返回:None
  • 特殊情况
def func():
    return 1,2,3,4
  1. 作用域
  • 全局和局部
  • 优先使用自己局部作用域,再使用全局作用域
  • 子作用域只能读取或修改父级的值,不能重新赋值
  • global和nonlocal的区别
  1. 函数的嵌套

内容详细:

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