Python中的函数(二)

一 局部变量与全局变量

在子程序中定义的变量为局部变量,在程序一开始定义的变量为全局变量。

全局变量作用域为整个程序,局部变量作用域为定义该变量的子程序。

当局部变量与全局变量同名时,在定义局部变量的子程序内是局部变量起作用,在其他地方全局变量起作用。

函数内无声明变量时,用的是全局变量:

 1 name = "abc"
 2 def change_name1():
 3     print(name)
 4 
 5 def change_name2():
 6     name = "123"
 7     print(name)
 8 
 9 change_name1()
10 change_name2()
输出:
abc
123

如果函数内容无global关键字,优先读取局部变量,无法对全局变量赋值。

当要子程序调用全局变量,并修改全局变量时在子程序变量前加 global :

 1 name = "abc"
 2 
 3 def change_name():
 4     global name
 5     name = "123"
 6     print(name)
 7 
 8 print(name)
 9 change_name()
10 print(name)
输出:
abc
123
123

 nonlocal的用法:

在嵌套函数中使用,想调用上一级函数的变量并修改时,要在本函数开头用nonlocal声明想要调用的变量

 1 def change_name1():
 2     name = "abc"
 3     print(name)
 4     def chang_name2():
 5         nonlocal name
 6         name = "123"
 7         print(name)
 8     chang_name2()
 9     print(name)
10 
11 
12 change_name1()
输出:
abc
123
123

前向引用----->>>>"函数即变量":在调用这个函数前如果没有定义该函数则会报错。

函数内部的嵌套函数只能该函数直接调用,其他函数无法直接调用该函数。

二 函数的递归

在函数内部,可以调用其它函数。如果一个函数在其内部调用它自己,这个函数就是递归函数。

1 def count(n):
2     print(n)
3     if n > 0:
4         count(n-1)
5     return 0
6 
7 count(5)
输出:
5
4
3
2
1
0

递归特性:

  • 必须要有一个明确的结束条件,否则就成了死循环
  • 每次进入更深一层递归时,问题规模都应该相比于上一次要少
  • 递归的执行效率不高,递归层次过多会导致栈溢出。

引用网上找的图片

 三 匿名函数

匿名函数就是不需要显示的指定函数。

1 #一般函数
2 def count(n):
3     return n+1
4 print(count(10))
5 
6 #换成的匿名函数
7 count = lambda x:x+1
8 print(count(10))

匿名函数主要和其他函数一起用。

四 函数式编程

高阶函数,满足下面条件至一:

  1. 函数的传入参数是一个函数名
  2. 函数的返回值是一个函数

map:

#map函数 map(fun,num)  fun:函数;num:可迭代对象
1
num = [1,2,3,5,6,9,8] 2 def map_test(fun,num_l): 3 res = [] 4 for i in num_l: 5 re = fun(i) 6 res.append(re) 7 return res 8 9 print(map_test(lambda x:x-1,num)) 10 #map生成的是一个可迭代对象 11 print("内置map函数",list(map(lambda x:x-1,num)))
输出:
[0, 1, 2, 4, 5, 8, 7]
[0, 1, 2, 4, 5, 8, 7]

filter:

 1 n_people = ["1sb","2","3sb","4"]
 2 
 3 def filter_test(fun,str_l):
 4     res = []
 5     for i in str_l:
 6         if fun(i):
 7             res.append(i)
 8     return res
 9 
10 print(filter_test(lambda n:n.endswith("sb"),n_people))
11 #filter 函数,生成的是一个可迭代对象
12 print("filter生成的是:",filter(lambda n:n.endswith("sb"),n_people))
13 print(list(filter(lambda n:n.endswith("sb"),n_people)))
输出:
['1sb', '3sb']
filter生成的是: <filter object at 0x0000020FFB28C2E8>
['1sb', '3sb']

reduce:

 1 num_l = [1, 2, 3, 4, 5, 6]
 2 
 3 def reduce_test(func, num , init=None):
 4     if init == None:
 5         str_l = num.copy()
 6         res = str_l.pop(0)
 7     else:
 8         res = init
 9     for i in str_l:
10         res = func(res, i)
11     return res
12 
13 print(reduce_test(lambda x,y:x+y,num_l))
14 print(reduce_test(lambda x,y:x*y,num_l))
15 
16 from functools import reduce
17 print("reduce生成的是:",reduce(lambda x,y:x+y,num_l))
18 print("reduce生成的是:",reduce(lambda x,y:x*y,num_l))
输出:
21
720
reduce生成的是: 21
reduce生成的是: 720
原文地址:https://www.cnblogs.com/kaixindexiaocao/p/9696534.html