Python3函数

http://www.cnblogs.com/linhaifeng/articles/6113086.html

函数参数

1.形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

2.实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值

3.位置参数和关键字(标准调用:实参与形参位置一一对应;关键字调用:位置无需固定)

 

  • #位置参数,必须一一对应,缺一不行多一也不行
  • 关键字参数,无须一一对应,缺一不行多一也不行
  • 混合使用位置参数和关键字参数时,关键字参数一定要放到后面,并且关键字参数不能与位置参数相同

 

 1 def prt(x, y, z):
 2     print(x)
 3     print(y)
 4     print(z)
 5 
 6 
 7 # prt(0, 1)
 8 prt(2, 0, 4)  # 传递的参数数量满足函数需求
 9 # prt(x=1, 2, 4)    # SyntaxError: positional argument follows keyword argument
10 # prt(2 , 3, y=3)   # TypeError: prt() got multiple values for argument 'y'
11 prt(1, 2, z=3)  # 位置参数和关键字参数混合使用
12 prt(0, z=0, y=2)  # 关键字参数无需按照传入顺序
13 prt(z=2, x=1, y=123)  # 采用关键字进行传值

 

4.默认参数

1 def prt(x, y=1, z=None):
2     print(x)
3     print(y)
4     print(z)
5 
6 
7 prt(1)        #结果为1 1 None
8 prt(1,2)    #结果为1 2 None
9 prt(1,2,4)    #结果为 1 2 4

 

5.参数组

×args的使用:

 1 # *args会将多余的参数保存到元组中
 2 def prt(x, *args):
 3     print(x)
 4     print(args)
 5     print()
 6 
 7 
 8 prt(1)  # 结果为: 1 ()
 9 prt(1, 2)  # 结果为: 1 (2, )
10 prt(1, 2, 4)  # 结果为: (2, 4)
11 prt(2, ['a', 'b'])  # 结果为:2 (['a', 'b'],)
12 prt(2, *['a', 'b'])  # 结果为:2 ('a', 'b')
13 prt(2, *('a', 'b',))  # 结果为:2 ('a', 'b')
14 prt(1, {'name': 'alex'})  # 结果为:1 ({'name': 'alex'},)

×kwargs的使用:

 1 # **kwargs参数,接收的是字典,所以可以用关键字方法传递参数
 2 def prt(x, **kwargs):
 3     print(x)
 4     print(kwargs)
 5     print()
 6 
 7 
 8 prt(1)  # 结果为: 1 {}
 9 prt(1, k1=2, k2=3)  # 结果为: 1 {'k1': 2, 'k2': 3}
10 # prt(1, 2, k=4)  # TypeError: prt() takes 1 positional argument but 2 were given
11 # prt(1, x=2, k=4)  # TypeError: prt() got multiple values for argument 'x'

×args和×kwargs同时使用:

 1 # *args与**kwargs同时使用,可以接收万能参数,但是也必须遵守位置和关键字参数规则,因此*args必须放在**kwargs前面。
 2 def prt(x, *args, **kwargs):
 3     print(x)
 4     print(args)
 5     print(kwargs)
 6     print()
 7 
 8 
 9 # prt(1, 1, 2, 1, 1, 11, 1, x=1, y=2, z=3) #TypeError: prt() got multiple values for argument 'x'
10 prt(1, 1, 2, 1, 1, 11, 1, y=2, z=3)  # 结果为: 1 (1, 2, 1, 1, 11, 1) {'y': 2, 'z': 3}
11 prt(1, *[1, 2, 3], **{'y': 1})   # 结果为: 1  (1, 2, 3) {'y': 1}

 函数递归调用:

  递归函数:在函数内部,可以调用其他函数。如果在调用一个函数的过程中直接或间接调用自身本身。

  编写递归函数需要注意点:

  • 必须有明确的结束条件,否则可能无限进行调用,进而导致内存溢出,可以采用if语句进行判断
  • 每次进入更深一层递归时,问题规模比上一层递归要减少
  • 递归的效率不高,主要原因是每一层的返回都在等下一层的调用结果,最后一层拿到结果后将结果返回给上层函数,这样会产生不必要的等待。
  • 递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)

堆栈扫盲http://www.cnblogs.com/lln7777/archive/2012/03/14/2396164.html 

尾递归优化:http://egon09.blog.51cto.com/9161406/1842475

递归代码示例:

  • 数字二分查找
 1 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35]
 2 
 3 
 4 def binary_search(dataset, find_num):
 5     print(dataset)
 6 
 7     if len(dataset) > 1:
 8         mid = int(len(dataset) / 2)
 9         if dataset[mid] == find_num:  # find it
10             print("找到数字", dataset[mid])
11         elif dataset[mid] > find_num:  # 找的数在mid左面
12             print("\033[31;1m找的数在mid[%s]左面\033[0m" % dataset[mid])
13             return binary_search(dataset[0:mid], find_num)
14         else:  # 找的数在mid右面
15             print("\033[32;1m找的数在mid[%s]右面\033[0m" % dataset[mid])
16             return binary_search(dataset[mid + 1:], find_num)
17     else:
18         if dataset[0] == find_num:  # find it
19             print("找到数字啦", dataset[0])
20         else:
21             print("没的分了,要找的数字[%s]不在列表里" % find_num)
22 
23 
24 binary_search(data, 66)
  •  递归问路
 1 import time
 2 person_list = ['alex', 'wupeiqi', 'yuanhao', 'linhaifeng']
 3 
 4 
 5 def ask_way(person_list):
 6     print('-' * 60)
 7     if len(person_list) == 0:
 8         return '没人知道'
 9     person = person_list.pop(0)
10     if person == 'linhaifeng':
11         return '%s说:我知道,老男孩就在沙河汇德商厦,下地铁就是' % person
12     print('hi 美男[%s],敢问路在何方' % person)
13     print('%s回答道:我不知道,但念你慧眼识猪,你等着,我帮你问问%s...' % (person, person_list))
14     time.sleep(3)
15     res = ask_way(person_list)
16     # print('%s问的结果是: %res' %(person,res))
17     return res
18 
19 
20 res = ask_way(person_list)
21 
22 print(res)

 高阶函数

满足俩个特性任意一个即为高阶函数

1.函数的传入参数是一个函数名

2.函数的返回值是一个函数名

map函数:

map函数接收2个参数,第一个参数为处理方法,第二个参数为可迭代对象

处理方法可以是自定义函数,也可以是lambda匿名函数。

 1 list1 = [1, 4, 5, 6, 7]
 2 list2 = [x ** 2 for x in list1]
 3 print(list2)
 4 x = lambda x: x ** 2
 5 
 6 print(list(map(x, list1)))
 7 
 8 y = lambda item: item.upper()
 9 name = 'aaabbbccc'
10 print(set(map(y, name)))
11 print(list(map(y, name)))
12 print(tuple(map(y, name)))

 

 

posted @ 2018-04-11 15:21  忙碌的捕快  阅读(146)  评论(0)    收藏  举报
levels of contents