一、匿名函数
1.基本知识
-
字面量:
函数名 = lambda 参数列表:返回值 -
说明:
-
函数名 -> 变量名
-
lambda -> 关键字
-
参数列表 -> 参数名1, 参数名2...
-
: -> 固定的
-
返回值 -> 相当于只有一个return语句的函数体
-
-
例子:
sum1 = lambda num1=10, num2=3: num1+num2
print(sum1(10, 20))
print(sum1(num1=100, num2=200))
print(sum1())
sum11 = lambda *nums: sum(nums)
print(sum11(1, 2, 3))
#30
#300
#13
#6
2.应用
- 读程序:
funcs = []
for item in range(1, 5):
funcs.append(lambda x: x*item)
print(item)
"""
item = 1 ~ 4
item = 1 [lambda x: x*item]
item = 2 [lambda x: x*item, lambda x: x*item]
item = 3 [lambda x: x*item, lambda x: x*item, lambda x: x*item]
item = 4 [lambda x: x*item, lambda x: x*item, lambda x: x*item, lambda x: x*item]
"""
print(funcs[0](2)) # 2*4 8
print(funcs[1](2)) # 2*4 8
二、变量作用域
1.作用域
- 定义:
变量的作用域指的是变量能够使用的范围
2.全局变量
-
定义:
声明在函数和类的外面的变量都是全局变量 -
作用域:
作用域是从声明开始,到整个py文件结束(任何地方都可以使用) -
例子:
a = 10
# x和b都是全局变量
for x in range(5):
b = 10
print(x)
3.局部变量
-
定义:声明在函数和类中的变量都是局部变量
-
作用域:声明在函数的局部变量,作用域是从声明开始到整个函数结束
-
例子:
def fun1():
# 局部变量
aa = 100
print(aa, a1)
for xx in range(5):
print(aa+xx)
4.global关键字
-
定义:
在函数中说明一个变量是全局变量 -
注意:
只能在函数中使用 -
例子:
name = 'abc'
def func2():
global age
age = 18
global name # 说明当前函数中使用的name是全局变量name
name = 'aaa'
print(name)
func2()
print(name)
print(age)
#aaa
#aaa
#18
5.nonlocal关键字
-
用法:
想要在局部的局部中修改局部变量的值 -
例子:
def func3():
abc = 100
def func4():
nonlocal abc
abc = 200
print('f4:', abc)
func4()
print('f3:', abc)
func3()
#f4: 200
#f3: 200
三、函数做变量
1.定义
- 声明函数就是声明一个类型是function的变量, 函数名实质就是变量名。
2.作用
- a.给其他变量赋值
def func11():
print('我是函数')
# 用一个函数给变量a赋值,a也是一个函数
a = func11
a()
print(a)
#我是函数
#<function func11 at 0x0000024629456048>
- b.作为列表的元素
def func22():
print('我又是函数')
return 10
list2 = [1, func22, func22()]
print(list2)
# list2[1]取到一个函数, 通过后面加()调用函数
print(list2[1]())
# list2[2]取到的是整数10
print(list2[2]+100)
#[1, 10] 110
#我又是函数
#[1, <function func22 at 0x000002462B11FAE8>, 10]
#我又是函数
#10
#110
- c.将函数作为参数
list2 = [
{'name': '张三', 'age': 20, 'score': 90},
{'name': '李四', 'age': 28, 'score': 70},
{'name': '王五', 'age': 18, 'score': 89}
]
# 根据成绩排序
# def get_age(item):
# return item['score']
# list2.sort(key=get_age)
list2.sort(key=lambda item: item['score'])
print(list2)
#[{'name': '李四', 'age': 28, 'score': 70}, {'name': '王五', 'age': 18, 'score': 89}, {'name': '张三', 'age': 20, 'score': 90}]
list3 = [
('a', 20),
(10, 3),
('b', 90)
]
# def second(item):
# return item[1]
# list3.sort(key=second, reverse=True)
# print(list3)
list3.sort(key=lambda item: item[1])
print(list3)
#[(10, 3), ('a', 20), ('b', 90)]
四、函数调用在内存中的影响
1.定义
- 函数的调用过程是一个压栈的过程,每次调用函数的时候,系统都会在内存中(栈)开辟空间来存储函数执行过程中产生数据(函数中声明的变量)。当函数调用完成后,这块内存会自动销毁。
五、递归函数
1.基本知识
-
定义:
递归函数:函数中调用函数本身,这样的函数就是递归函数(自己调自己) -
注意:循环能做的事情递归都可以做,但是实际上循环能解决的问题绝对不选递归
2.递归函数的声明
-
声明步骤:
-
第一步:确定临界值(循环结束的条件), 让函数结束
-
第二步:找关系,假设函数的功能已经实现,找f(n)和f(n-1)的关系
-
第三步:根据关系,用f(n-1)实现f(n)的功能
-
-
例子:
"""
yt_sum(5) n=5 5!=1 return yt_sum(4)+5
yt_sum(4) n=4 4!=1 return yt_sum(3) + 4
yt_sum(3) n=3 3!=1 return yt_sum(2) + 3
yt_sum(2) n=2 2!=1 return yt_sum(1) + 2
yt_sum(1) n=1 1==1 return 1
"""
# 写一个递归函数,实现:1+2+3+...n
def yt_sum(n):
# 1.找临界值
if n == 1:
return 1
# 2.找关系
"""
yt_sum(n) = 1+2+3+...+n
yt_sum(n-1) = 1+2+3+...+n-1
yt_sum(n) = yt_sum(n-1)+n
"""
# 3.用f(n-1)实现f(n)的功能
return yt_sum(n-1) + n
print(yt_sum(5))
#15
作业
- 写一个函数将一个指定的列表中的元素逆序( 如[1, 2, 3] -> [3, 2, 1])(注意:不要使 表自带的逆序函数)
ljk_reverse = lambda list1: list1[::-1]
print(ljk_reverse([1,2,3]))
#[3, 2, 1]
- 写一个函数,提取出字符串中所有奇数位上的字符
ljk_odd = lambda str1: str1[1::2]
print(ljk_odd('ljkhhh'))
#jhh
- 写一个匿名函数,判断指定的年是否是闰年
def ljk_bissextile_year(year:int):
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
print('是闰年')
else:
print('不是闰年')
ljk_bissextile_year(1800)
ljk_bissextile_year(2000)
#不是闰年
#是闰年
- 使用递归打印:
n = 3的时候
@
@@@
@@@@@
n = 4的时候:
@
@@@
@@@@@
@@@@@@@
x = 0
def print_star(n):
global x
x += 1
if n == 1:
print((x-n)*' '+'@'+(x-n)*' ')
return
print_star(n-1)
m = 2 * n - 1
print((x-n)*' '+'@' * m+(x-n)*' ')
print_star(4)
# @
# @@@
# @@@@@
#@@@@@@@
- 写函数,利用递归获取斐波那契数列中的第 10 个数,并将该值返回给调用者。
def ljk_seq(n = 10):
if n ==1 or n ==2:
return 1
return ljk_seq (n-1) + ljk_seq(n-2)
print(ljk_seq())
#55
- 写一个函数,获取列表中的成绩的平均值,和最高分
def ljk_score(list1:list):
list1.sort()
print('最高分:',list1[-1])
count = 0
for x in list1:
count += x
print('平均值:',count/len(list1))
ljk_score([18,54,77,22,99,23,100,66])
#最高分: 100
#平均值: 57.375
- 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新的列表返回给调用者
def ljk_check(data1):
list1 = []
for x in data1[1::2]:
list1.append(x)
return list1
print(ljk_check((1, 2, 3, 4, 5)))
#[2, 4]
- 实现属于自己的字典update方法:用一个字典去更新另一个字典的元素(不能使用自带的update方法)
yt_update(字典1, 字典2)
def ljk_update(dict1:dict,dict2:dict):
for key in dict2:
dict1[key]=dict2[key]
return dict1
dict1={"name":"哈哈哈","age":22}
dict2={"age": 15,"school":"清华"}
print(ljk_update(dict1,dict2))
#{'name': '哈哈哈', 'age': 15, 'school': '清华'}
- 实现属于自己的items方法:将字典转换成列表,字典中的键值对转换成元祖。(不能使用items方法)
yt_items(字典)
例如:{'a': 1, 'b':2, 'c':3} ---> [('a', 1), ('b', 2), ('c', 3)]
def ljk_items(dict1:dict):
list1=[]
for key in dict1:
x=(key,dict1[key])
list1.append(x)
return list1
print(ljk_items({"name":"哈哈哈","age":22}))
#[('name', '哈哈哈'), ('age', 22)]
网友评论