day10-函数的应用
2018-10-11 本文已影响0人
_桑心人
1.匿名函数
普通函数:
def 函数名(参数列表):
函数体
匿名函数
函数名= lambada 参数列表:返回值
说明
函数名 -> 变量名
lambda -> 关键字
参数列表 -> 参数名1,参数名2......
返回值 -> 相当于只有一个return语句的函数体
匿名函数的调用和普通函数一样:函数名(实参列表)
也支持位置参数、关键字参数、参数设置默认值、不定长参数
代码示例
# 写一个匿名函数,功能是求两个数的和
sum1 = lambda num1, num2: num1+num2
print(sum1(10, 20))
# 相当于上面的匿名函数
# def sum1(num1, num2)
# return num1+num2
运行结果
30
练习:读程序
代码如下
sum2 = lambda n: sum(range(1, n+1))
print(sum2(100))
运行结果
5050
练习:读程序
代码示例
funcs = []
for item in range(1, 5):
funcs.append(lambda x: x*item)
print(funcs[0](2))
print(funcs[1](2))
运行结果
8
8
2.变量的作用域
1.变量的作用域
变量的作用域指的是变量能够使用的范围
2.全局变量和局部变量
全局变量:声明在函数和类的外面的变量都是全局变量;作用域是从声明开始到整个py文件结束
都可以使用
代码示例
# 全局变量
a = 10
print('=====')
for x in range(5):
print(a)
print(x)
def fun1():
print(a)
fun1()
# x, y, c都是全局变量
for x in range(5):
for y in range(2):
c = 100
运行结果
10
0
10
1
10
2
10
3
10
4
10
3.局部变量
声明在函数和类中的变量。作用域是从声明开始到整个函数结束
代码示例
ef fun1():
# 局部变量
aa = 100
print(aa)
4.global关键字
在函数中说明一个变量是全局变量
代码示例
name = 'abc'
def func2():
global name # 说明当前函数中使用的name是全局变量name
global age # 声明一个全局变量
age = 18
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
3.函数作为变量
声明函数就是声明一个类型是function的变量,函数名实质就是变量名
代码示例
def func1():
print('=====')
print(type(func1))
运行结果
<class 'function'>
-
1.变量可以给其他变量赋值
代码示例
a = 10
b = a
print(b*10)
list1 = [1, 2]
list2 = list1
list2.append(100)
print(list1)
# 声明一个变量func2,类型为function
def func2():
print('我是函数')
func1 = lambda x: print(x)
func3 = func1
func3(10)
a = func2
a()
# 将函数func2的返回值给b
b = func2()
print(b)
运行结果
100
[1, 2, 100]
10
我是函数
我是函数
None
-
2.函数作为列表的元素
代码示例
a = 10
list1 = [1, a]
print(list1, list1[1] + 100)
def func22():
print('我又是函数')
return 10
list2 = [1, func22, func22()]
print(list2)
# list2[1]取到一个函数,通过后面加()调用函数
print(list2[1]())
运行结果
[1, 10] 110
我又是函数
[1, <function func22 at 0x00000285157D4AE8>, 10]
我又是函数
10
-
3.将函数作为参数
代码示例
a = 10
def func1(n):
print(n)
func1(a)
def func11(n):
print('aaa')
n()
def func12():
print('hello world!')
func11(func12)
运行结果
10
aaa
hello world!
应用:sort的使用
列表.sort(key=None, reverse=False)
使用sort的时候,可以通过给key赋一个函数变量,来规定列表中的元素按照什么标准来排序
这儿的函数变量要求要有一个参数和一个返回值。参数代表列表中的元素,返回值代表按照那个
标准排序
代码示例
list1 = [1, 45, 8, 89]
list1.sort()
print(list1)
list2 = [
{'name': '张三', 'age': 20, 'score': 90},
{'name': '李四', 'age': 28, 'score': 100},
{'name': '王五', 'age': 18, 'score': 89}
]
def get_score(item): # 根据成绩排序
return item['score']
list2.sort(key=get_score)
print(list2)
list3 = [
('a', 20),
(10, 3),
('c', 90)
]
def get_2(item):
return item[1]
list3.sort(key=get_2, reverse=True)
print(list3)
list3.sort(key=lambda item: item[1])
print(list3)
运行结果
[1, 8, 45, 89]
[{'name': '王五', 'age': 18, 'score': 89}, {'name': '张三', 'age': 20, 'score': 90}, {'name': '李四', 'age': 28, 'score': 100}]
[('c', 90), ('a', 20), (10, 3)]
[(10, 3), ('a', 20), ('c', 90)]
-
4.将函数作为返回值
代码示例
def operation(operator: str): # 根据运算符号,返回对应的功能
if operator == "+":
def func111(*args, **kwargs):
sum1 = 0
for item in args:
sum1 += item
for key in kwargs:
sum1 += kwargs[key]
return sum1
return func111
elif operator == "*":
def func222(*args, **kwargs):
sum1 = 1
for item in args:
sum1 *= item
for key in kwargs:
sum1 *= kwargs[key]
return sum1
return func222
print(operation('+')(90, 98))
print(operation('+')(90, 98, a=2))
print(operation('*')(10, 30, a=2))
print(operation('*')(10, 30, 30, 10))
运行结果
188
190
600
90000
4.函数的调用
1.补充:python中的函数可以有多个返回值
代码示例
# 求多个数的和以及平均值
def yt_sum(*nums):
sum1 = sum(nums)
average = sum1 / len(nums)
return sum1, average
a, b = yt_sum(2, 56, 78, 65, 6)
num = yt_sum(2, 56, 78, 65, 6)
print(a, b)
print(num[0], num[1])
运行结果
207 41.4
207 41.4
2.函数的调用是一个压栈的过程
每次调用函数的时候,系统都会在内存中(栈)开辟空间来存储函数执行过程中产生的数据
(函数中声明的变量)。
当函数调用完成后,这块内存会自动销毁
5.递归函数(了解)
递归函数:函数中调用函数本身,这样的函数就是递归函数(自己调用自己)
循环能做的事情递归都可以做,但是实际循环能解决的问题绝对不选递归
代码示例
def func1():
print('=====')
func1()
怎么些递归函数
第一步:确定临界值(循环结束的条件),让函数结束
第一步:找关系,假设函数的功能已经实现,找f(n)和f(n-1)的关系
第三部:根据关系,用f(n-1)实现f(n)的功能
代码示例
# 写一个递归函数,实现:1+2+3+.....n
def yt_sun(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
"""
return yt_sun(n-1) + n
print(yt_sun(100))
# 用递归实现一下功能
"""
n = 3
***
**
*
n = 4
****
***
**
*
......
"""
def print_star(n):
if n == 1:
print('*')
return
print('*'*n)
print_star(n-1)
print_star(5)
"""
n = 3
*
**
***
.....
"""
def print_star(n):
if n == 1:
print('*')
return
print_star(n - 1)
print('*' * n)
print_star(3)
运行结果
5050
*****
****
***
**
*
*
**
***