day12函数进阶(9.29)
1.review
"""
def 函数名(形参列表):
函数说明文档
函数体
"""
"""
return 数据1,数据2,。。。(形成的元组,省略括号)
函数名(数据1,数据2,数据3,。。。)
函数名(实参列表) - 调用函数(函数调用表达式)
函数调用表达式的值就是函数的返回值
"""
def func1():
return 100, 12
result = func1()
print(result)
x, y = func1()
print(x, y)
"""
1.回到函数定义的位置,传参(用实参给形参赋值)
2.执行函数体
3.确定函数返回值(执行函数体的时候如果遇到return,return后面的值就是函数返回值,否则返回值是None)(没有return是None)
4.回到函数调用的位置接着往后执行(这个时候函数调用表达式的值就是函数的返回值)
"""
def func2(x, y):
print('++++')
print('----')
return x*10 + y
result = func2(10, 23)
func2(10, 20)
func2(x=10, y=201)
func2(y=201, x=10)
func2(10, y=10)
def func3(x=10, y=20, z=30):
pass
def func3(x, y=20, z=30):
pass
def func4(x:str, y = 10, z='')->float:
pass
"""
*参数名 - 本质是元组;必须是位置参数
**参数名 - 本质是字典;必须是关键字参数
"""
def func5(x, y, *,m,n):
pass
2、day11函数基础作业更改版
def maketrans(key_str:str, value_str:str):
"""
将两个字符串转换成字典
:param key_str: 提供键的字符串
:param value_str: 提供值的字符串
:return:
"""
len1 = len(key_str)
len2 = len(value_str)
result = {}
for index in range(min(len1, len2)):
result[key_str[index]]=value_str[index]
return result
print(maketrans('abc', '1234'))
print(maketrans('abcdef', '1234'))
s1 = {}
s1[2] = 1
print(s1)
def join(str1:str, seq):
new_str = ''
for x in seq:
new_str += str(x)+str1
return new_str[:-len(str1)]
print(join('++',[100,'abc',12.3,True]))
def upper(str1:str):
for x in str1:
if not 'A'<= x <='Z':
return False
return True
print(upper('ABZNCMS-AAA'))
def clear(list1:list):
len1 = len(list1)
for _ in range(len1):
del list1[0]
nums = [12, 32, 14, 10]
clear(nums)
print(nums)
def reverse(list1:list):
return list1[::-1]
nums = [23, 19, 20, 90]
result = reverse(nums)
print(nums,result)
def reverse(list1:list):
len1 = len(list1)
for index1 in range(len1//2):
index2 = len1 - index1 -1
list1[index1],list1[index2] = list1[index2],list1[index1]
nums = [23, 19, 20, 90]
nums = [23, 19, 20, 90]
result = reverse(nums)
print(nums,result)
3、匿名函数
1.*匿名函数 - 没有名字的函数 “”" 匿名函数的本质还是函数,但是匿名函数只能实现一句代码就能实现的功能 语法: 函数名 = lambda 参数列表:返回值(返回值有结果的表达式)(类型说明不支持)
说明: lambda - 关键字;固定写法 参数列表 - 普通函数写在()普通函数中的形参列表 : - 固定写法 返回值 - 相当于普通函数的return后面的值
注意:匿名函数需要先保持才能再调用
函数名(变量) = lambda 参数列表:返回值 相当于 def 函数名(参数列表): return 返回值 “”"
sum1 = lambda x,y:x+y
result = sum1(10, 20)
print(result)
result = sum1(y=200, x=100)
print(result)
sum1 = lambda x,y=2:x+y
result = sum1(10)
print(result)
is_even = lambda num: num % 2 ==0
print(is_even(1))
list1 = [10, lambda x:x*3]
list1[-1](10)
print(list1[-1](10))
dict1 = {'a':1 , 'b':lambda x:x*3}
print(dict1['b'](12) + 100)
func1 = lambda *x: 100
func1(10)
func1(12, 23)
4、变量作用域
1.变量作用域 - 变量可以使用的范围 “”" 根据变量作用域的不同,可以将变量分为:全局变量和局部变量
“”" 2.全局变量 “”" 没有定义在函数或者类里面的变量就是全局变量; 全局变量的作用域:从定义开始到程序结束(从定义开始到文件结束的任何位置都可以使用) “”"
a = 100
for x in range(3):
b = 10
print(f'函数外a:{a},x:{x},b:{b}')
def func1():
print(f'函数外a:{a},x:{x},b:{b}')
func1()
3.局部变量 “”" 局部变量就是定义在函数里面的变量(形参也是局部变量); 局部变量的作用域:从定义开始到函数结束 “”"
print('--------局部变量------------')
def func2(m):
n = 10
print(f'函数里面m:{m},n:{n}')
func2(100)
4.全局变量和局部变量的底层逻辑 “”" 全局变量是保存在全局的栈区间中,全局栈区间是在程序运行结束的时候才会被释放。 当程序调用函数的时候,系统会自动给这个函数创建一个独立的栈区间,专门用来保存在函数中产生的数据(局部变量就是保存在这个内存区间中) ,当函数调用结束这个栈区间会自动释放。 “”"
5.global和nonlocal “”" python调试工具:https://pythontutor.com/visualize.html#mode=edit 1)global 应用1:在函数内部修改全局变量的值使用global 变量名(放在变量修改的前面) 应用2:在函数内部定义一个全局变量
注意:使用global的时候必须保证在函数里面global修饰的变量不会出现在它的前面。 “”"
xx = 1000
yy = 1000
def func3():
xx = 2000
print(f'函数内部xx:{xx}')
global yy
yy = 2000
print(f'函数内部yy:{yy}')
global num
num = 100
print(f'函数内部num:{num}')
func3()
print(f'函数外部xx:{xx}')
print(f'函数外部yy:{yy}')
print(f'函数外部num:{num}')
def func4():
k = 100
def func5():
nonlocal k
k = 200
print(f'func5k:{k}')
func5()
print(f'func4中k:{k}')
func4()
5、高阶函数(重要)
**1.函数就是变量(函数名就是变量名) “”" python中定义函数其实就是定义一个类型是function的变量,函数名就是变量名. 变量能做的事情,函数都能做。 “”" 函数名= lambda 参数列表:返回值 def 函数名(参数列表): return 返回值
a = lambda x:x*22
print(type(a))
a = 100
print(type(a))
def a(x):
return x*2
print(type(a))
场景一:可以通过使用变量来使用变量中保存的数据,如果这个数据的函数,函数的通用操作是调用它。
x = 100
print(x % 2)
x = 'abc'
print(x[-1])
x = [1, 2, 3, 4]
x.append(12)
x = {12, }
x = lambda m:m+100
print(x(7))
def x(m):
return m+100
x(7)
print(x)
场景二:用一个变量给另外一个变量赋值
m = 100
n = m
print(n * 100)
def mm():
print('这是一个函数')
nn = mm
nn()
场景三:修改变量的值
m = 100
print(m % 10)
m = [10, 21]
print(m[-1])
def mm():
print('-----')
mm()
mm = 100
print(mm % 10)
a = 100
def b():
print('我是另外一个函数')
list1 = [a, 200, b]
list1[-1]()
print('x:',list1[-1]())
list1 = [a, 200, b()]
print(list1)
2.高阶函数 “”" 1)变量可以作为函数的实参 实参高阶函数 - 如果一个函数的参数是函数,那么这个函数就是一个实参高阶函数 2)函数可以作为函数的返回值 返回值高阶函数 - 如果一个函数的返回值是函数,那么这个函数就是一个返回值高阶函数 “”"
def func2(x):
x()+10
def func3(x):
def t():
pass
return t
func3(10)()
def func2(x):
x * 1.2
x()
x[-1]
x['a']
x()
func2()
6、实参高阶函数(重要)
1.max,min,sorted “”"
- max(序列,key=函数) - 根据函数提供的方式来获取序列中元素的最大值
函数的要求:1)有且只有一个参数,这个参数指向的是序列中的每个元素 2)需要一个返回值,返回值是比较对象
“”"
nums = [28, 52, 61, 70, 84, 9]
print(max(nums))
f = lambda item: item
print(max(nums, key=f))
print(max(nums, key=lambda item:item))
nums = [28, 52, 61, 70, 84, 39]
print(max(nums, key=lambda item:item%10))
students = [
{'name': 'stu1', 'age': 28, 'score': 90},
{'name': 'stu2', 'age': 20, 'score': 99},
{'name': 'stu3', 'age': 18, 'score': 88},
{'name': 'stu4', 'age': 32, 'score': 92}
]
print(max(students, key=lambda item:item['age']))
nums = [123, 78, 90, 301, 49]
nums = [123, 78, 90, 301, 49]
def t(item):
sum1 = 0
for x in str(item):
sum1 += int(x)
return sum1
print(max(nums,key=t))
print(max(nums,key = lambda item:sum([int(x) for x in str(item)])))
students = [
{'name': 'stu1', 'age': 28, 'score': 90},
{'name': 'stu2', 'age': 20, 'score': 99},
{'name': 'stu3', 'age': 18, 'score': 88},
{'name': 'stu4', 'age': 32, 'score': 92}
]
print(max(students,key= lambda item:item['score']))
print(min(students,key= lambda item:item['score']))
nums = [28, 52, 61, 70, 84, 39]
print(sorted(nums,key=lambda item:item % 10))
nums = [23, '100', 56, '12.7', '100.2']
print(sorted(nums, key=lambda item: float(item),reverse=True))
2.map “”" 1)map(函数,序列) - 将序列中的元素按照函数提供的方式进行变换 函数的要求:1.有且只有一个参数,指向序列中的每个元素 2.需要一个返回值,返回值就是新序列中的元素(描述清楚新序列的元素和原序列元素的关系) 相当于(推导式) [返回值 for 参数 in 序列] 2)map(函数,序列1,序列2) 函数的要求:1.有且只有两个参数,分别指向两个序列中的元素 2.需要一个返回值,返回值就是新序列中的元素 3)map(函数,序列1,序列2,序列3,序列4,…) “”"
nums = [28, 52, 61, 70, 84, 39]
result = list(map(lambda item:item % 10, nums))
print(result)
A =[10,20,30,40]
B= ['a','b','c','m']
result = list(map(lambda i1,i2:i2+str(i1),A,B))
print(result)
names = ['张三', '小明', '李四', '小花']
scores = [90, 89, 99, 70]
result = list(map(lambda value1, value2:{'names':value1,'score':value2},names,scores))
print(result)
3.reduce(合并) - 将一个序列中的元素按照指定的规则合并成一个数据 “”" reduce(函数,序列,初始值) - 用指定的初始值来将序列中的元素按照函数指定的规则合并成一个数据。 函数的要求:1)有且只有两个参数:第一个参数指向初始值;第二个参数指向序列中的每个元素; 2)需要一个返回值:描述清楚最后合并的结果是初始值和序列中的元素通过什么样的方式合并产生的。 “”"
from functools import reduce
nums = [10, 20, 30]
result = reduce(lambda x,y:x+y,nums,0)
print(result)
result = reduce(lambda x,y:x*y,nums,1)
print(result)
result = reduce(lambda x,y:x+str(y),nums,'')
print(result,type(result))
nums = [10, 20, 30]
result = reduce(lambda x,y:x+str(y//10%10),nums,'')
print(result)
result = reduce(lambda x,y:x+(y//10%10),nums,0)
print(result)
|