Python基础——函数(200512)

Python——函数

函数

1.函数概述:

  函数:用于完成特定功能的一段代码块,可用于重复使用。函数能够提高应用的模块性,和代码的利用率;函数包含内置函数和用户自定义的函数两种。

2.为什么使用函数:

  • 代码可以重复使用,提高代码的利用率

  • 保持代码一致性,易维护

  • 可扩展性

 

定义函数

1.定义一个函数

  1)可以定义一个特定功能的函数,规则如下:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号()
  • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明
  • 函数内容以冒号起始,并且缩进
  • return [表达式] 结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None

  2)语法:

 1 def function(x):
 2   '''函数说明文档'''
 3     x += 1
 4     return expression
 5 function(2)
 6 
 7 # def:定义函数的关键字
 8 # function:函数名
 9 # ():括号内可以设置参数,形参
10 # x += 1:泛指代码块或程序处理逻辑
11 # return expression:定义返回值
12 # function(2):传入实参

  3)举例:定义一个打印 hello + name 的函数

1 def greet(name):
2     '''打招呼函数'''
3     mes = 'hello %s !'%name
4     return mes
5 res = greet('alex')
6 print(res)
7 # =>hello alex !

2.函数返回值

  1)函数和过程

  • 过程:没有return返回值的函数
  • 函数:有return返回值

  2)返回值

  return [expression] 语句:退出函数,函数运行到return语句就是直接退出函数,不会再继续运行函数体内return下面的语句。return返回值。

  <1>  默认返回值

  默认返回值:在函数体内部若无return返回值,则默认返回None,return是函数结束的标志。

1 def greet(name):
2     print('hello %s !'%name)
3 print(greet('张三'))
4 # =>hello 张三 !
5 # =>None

  <2> 1个返回值

  有1个返回值:指定了返回值

1 def greet(name):
2     print('hello %s !'%name)
3     return '你真棒!'
4 print(greet('张三'))
5 # =>hello 张三 !
6 # =>你真棒!

  <3> 多个返回值

  多个返回值:指定了多个返回值,当有多个返回值时,以元组形式返回,内含多个值

1 def greet(name):
2     print('hello %s !'%name)
3     return '你真棒!','Are you OK!','666'
4 print(greet('张三'))
5 # =>hello 张三 !
6 # =>('你真棒!', 'Are you OK!', '666')

3.函数参数

  1)形参和实参

  • 形参:形参在函数被调用时使用,只在函数体内部有效
  • 实参:可以是常量、变量、表达式、函数等,函数调用时将值传递给形参
1 def calc(x,y):  # x,y :形参
2     result = x+y
3     return result
4 c = calc(1,2) # 1,2:实参(具体数值)
5 print(c)
6 # =>3

  2)位置参数

  位置参数:传递的实参个数与形参必须一一对应,少一个和多一个都不行,不对应会报错

 1 # 一一对应
 2 def position(x,y,z):
 3     print(x)
 4     print(y)
 5     print(z)
 6 position(1,2,3)
 7 # =>1
 8 # =>2
 9 # =>3
10 
11 # 不对应
12 def position(x,y,z):
13     print(x)
14     print(y)
15     print(z)
16 position(1,2,3,4)
17 # =>报错

  3)关键字参数

  关键字参数:对形参无需对应,但必须进行一一指定 ,少一个和多一个都不行,否则会报错

1 def key(x,y,z):
2     print(x)
3     print(y)
4     print(z)
5 key(x=1,y=2,z=3)
6 # =>1
7 # =>2
8 # =>3

  4)位置和关键字参数混合使用

  位置和关键字参数混合使用:位置参数必须在左边也就是前边,关键字参数在后面,一一对应 关系,多个值会报错

 1 def position_key(x,y,z):
 2     print(x)
 3     print(y)
 4     print(z)
 5 position_key(1,2,z=3)
 6 # =>1
 7 # =>2
 8 # =>3
 9 
10 position(1,y=2,3) 
11 # =>报错

  5)默认参数

  默认参数:定义了默认形参,实参就可以不用传递,若传递会覆盖默认参数

1 def default(x,type='King'):   # type='King':为默认参数
2     print(x)
3     print(type)
4 default('hello')   # 不对默认参数进行传递
5 # =>hello
6 # =>King
7 default('hello','lisi')   # 对默认参数进行传递,会覆盖原有参数
8 # =>hello
9 # =>lisi

  6)参数组

  参数组:(**字典;*列表)传递可变长参数

 1 def test(x,*args):  # *:作为列表存储
 2     print(x)
 3     print(args)   # 作为元组输出
 4 test(1,2,3,4,5)
 5 # =>1
 6 # =>(2, 3, 4, 5)
 7 
 8 def test(x,**kwargs):  # **:作为字典存储
 9     print(x)
10     print(kwargs)   # 作为字典输出
11 test(1,y=2,z=3)
12 # =>1
13 # =>{'y': 2, 'z': 3}
14 
15 def test(x,*args,**kwargs):  # 可以接受多个值
16     print(x)
17     print(args)  # 作为元组输出
18     print(kwargs)   # 作为字典输出
19 test(1,2,3,4,5,6,7,y=2,z=3)
20 # =>1
21 # =>(2, 3, 4, 5, 6, 7)
22 # =>{'y': 2, 'z': 3}
23 test(1,*[1,2,3],**{'y':2,'z':3})
24 # =>1
25 # =>(1, 2, 3)
26 # =>{'y': 2, 'z': 3}

  7)参数集合实例

  1 # 第1种:1传给x;2传给y;3传给z
  2 def func(x,y,z):
  3     print(x,y,z)
  4 func(1,2,3)
  5 # =>1 2 3
  6 
  7 # 第2种:1传给x;3传给z;3传给y,改变y的默认值
  8 def func(x,z,y=5):
  9     print(x,y,z)
 10 func(1,3,3)
 11 # =>1 3 3
 12 
 13 # 第3种:1传给x; 2传给y; 3,4,5,6作为元组传给*z
 14 def func(x,y,*z):
 15     print(x,y,z)
 16 func(1,2,3,4,5,6)
 17 # =1 2 (3, 4, 5, 6)
 18 
 19 # 第4种:1传给x; 2,3作为元组传给*z;**y无元素传递为空字典
 20 def func(x,*z,**y):
 21     print(x,y,z)
 22 func(1,2,3)
 23 # =>1 {} (2, 3)
 24 
 25 # 第5种:1传给x; name=2,age=3键值对传给**z形成字典;*y无元素传递为空元组
 26 def func(x,*y,**z):
 27     print(x,y,z)
 28 func(1,name=2,age=3)
 29 # =>1 () {'name': 2, 'age': 3}
 30 
 31 # 第6种:1传给x;2,3,4作为元组传给*y;name=2,age=3键值对传给**z形成字典
 32 def func(x,*y,**z):
 33     print(x,y,z)
 34 func(1,2,3,4,name=2,age=3)
 35 # =>1 (2, 3, 4) {'name': 2, 'age': 3}
 36 
 37 # 第7种:name=2,age=3键值对传给**z成为字典;x=2为默认值无元素传递则继续为默认值2;*y无元素传递为空元组
 38 def func(x=2,*y,**z):
 39     print(x,y,z)
 40 func(name=2,age=3)
 41 # =>2 () {'name': 2, 'age': 3}
 42 
 43 # 第8种:1,2,3,4,5作为元组传给*y;**z无元素传递为空字典
 44 def func(*y,**z):
 45     print(y,z)
 46 func(1,2,3,4,5)
 47 # =>(1, 2, 3, 4, 5) {}
 48 
 49 # 第9种:[1,2,3,4,5]作为一个元素传给*y形成包含列表的元组;**z无元素传递为空字典
 50 def func(*y,**z):
 51     print(y,z)
 52 func([1,2,3,4,5])
 53 # =>([1, 2, 3, 4, 5],) {}
 54 
 55 # 第10种:*[1,2,3,4,5]有星号直接传给*y,直接中括号变小括号形成元组;**z无元素传递为空字典
 56 def func(*y,**z):
 57     print(y,z)
 58 func(*[1,2,3,4,5])
 59 # =>(1, 2, 3, 4, 5) {}
 60 
 61 # 第11种:*[1,2,3,4,5]有星号直接传给*y,直接中括号变小括号形成元组;name=2,age=3键值对传给**z形成字典
 62 def func(*y,**z):
 63     print(y,z)
 64 func(*[1,2,3,4,5],name='alex',age=18)
 65 # =>(1, 2, 3, 4, 5) {'name': 'alex', 'age': 18}
 66 
 67 # 第12种:*[1,2,3,4,5]有星号直接传给*y,直接中括号变小括号,{'name':'alex','age':18}无双星号,也作为一个元素最终形成元组;**z无元素传递为空字典
 68 def func(*y,**z):
 69     print(y,z)
 70 func(*[1,2,3,4,5],{'name':'alex','age':18})
 71 # =>(1, 2, 3, 4, 5, {'name': 'alex', 'age': 18}) {}
 72 
 73 # 第13种:*[1,2,3,4,5]有星号直接传给*y,直接中括号变小括号形成元组;**{'name':'alex','age':18}有双星号,直接作为字典传递,形成字典
 74 def func(*y,**z):
 75     print(y,z)
 76 func(*[1,2,3,4,5],**{'name':'alex','age':18})
 77 # =>(1, 2, 3, 4, 5) {'name': 'alex', 'age': 18}
 78 
 79 # 第14种
 80 def func1(x=1,*y,**z):
 81     print(x,y,z)
 82     return y
 83     print(x)
 84 def func2(arg):
 85     ret = func1(name=arg)
 86     print(ret)
 87 res = func2('alex')
 88 print(res)
 89 # =>1 () {'name': 'alex'}
 90 # =>()
 91 # =>None
 92 
 93 # 第15种
 94 def func(arg):
 95     arg.append(55)
 96 li = [11,22,33,44]
 97 func(li)
 98 print(li)
 99 # =>[11, 22, 33, 44, 55]
100 li = func(li)
101 print(li)
102 # =>None
103 
104 # 第16种
105 def func1(arg):
106     print(arg+100)
107 def func2(arg):
108     ret = func1(arg+1)
109     print(arg)
110     print(ret)
111 ret = func2(7)
112 print(ret)
113 # =>108
114 #   7
115 #   None
116 #   None
View Code

4.函数作用域

  一个程序内变量的访问不是随处都可以进行访问的,访问权限决定于变量在哪里被赋值。

  函数的作用域决定了在哪一部分可以访问哪个特定的变量名称,两种最基本的变量作用域为:

  • 全局变量
  • 局部变量

  1)函数作用域

  函数作用域:与函数的调用位置无关,只与存在位置有关

  <1> 一般函数作用域

1 def one():
2     print('666')
3 one()
4 # =>666
5 print(one)  # 打印one的内存地址
6 # =><function one at 0x000002004BC95438>
7 print(one())
8 # =>666
9 # =>None

  <2> 嵌套函数作用域

 1 name = '张三'
 2 def find_name():
 3     name = '李四'
 4     def find_name_one():
 5         name = '王二麻子'
 6         def find_name_two():
 7             name = '刘五'
 8             print(name)
 9         return find_name_two
10     return find_name_one
11 # 方法一:
12 value = find_name()   # 得到的值为find_name_one的内存地址
13 print(value)
14 # =><function find_name.<locals>.find_name_one at 0x0000020068585678>
15 value_one = value()    # 运行find_name_one()函数,得到的值为find_name_two的内存地址
16 print(value_one)
17 # =><function find_name.<locals>.find_name_one.<locals>.find_name_two at 0x000001B114285708>
18 value_two = value_one()    # 运行find_name_two()函数,打印‘刘五’,因函数中无返回值return,所以得到默认返回值None
19 print(value_two)
20 # =>刘五
21 # =>None
22 # 方法二
23 find_name()()()
24 # =>刘五
25 print(find_name()()())
26 # =>刘五
27 # =>None

5.局部变量与全局变量

  1)局部变量和全局变量

  • 局部变量和全局变量:在子程序中定义的变量称为局部变量,在程序一开始定义的变量称为全局变量。
  • 当全局变量与局部变量同名时,在定义了局部变量的子程序内,局部变量起作用;其它地方全局变量起作用。
1 name = '李四'   # 全局变量,全部能够使用
2 def what_name():
3     name1 = '王五'    # 局部变量,只能在函数体内使用,只能局部调用
4     print('%s , %s' %(name,name1))
5 what_name()
6 # =>李四 , 王五
7 print(name)
8 # =>李四

  2)global 关键字

  <1> 函数内无 global 关键字

  ① 有声明局部变量:
  • 优先读取局部变量;
  • 能读取全局变量,无法对全局变量重新赋值,但是对于可变类型(集合、列表、字典),可对其内部元素进行操作
 1 name = '李四'  # 不可变类型,全局变量
 2 def what_name():   # 无global关键字,有局部变量声明
 3     name = '张三'   # 声明局部变量
 4     print(name)
 5 print(name)  # 此处打印全局变量,局部变量没有对全局变量进行修改,还为调用函数
 6 # =>李四
 7 what_name()  # 此处进入函数what_name()内,由于函数体内对变量name进行了声明修改,所以打印出来为局部声明的变量
 8 # =>张三
 9 print(name)  # 此处没有global关键字,函数体内对name进行了修改但是无法影响到全局变量name
10 # =>李四
11 
12 li = [1,2,3,4,5]  # 可变类型,全局变量
13 def lis():
14     li.append(111)   # 读取全局变量,对于可变类型列表内的元素进行操作
15     print(li)
16 print(li)  # 没有运行函数体dis,全局变量没有变化
17 # =>[1, 2, 3, 4, 5]
18 lis()  # 运行了函数,对列表li进行了元素添加修改
19 # =>[1, 2, 3, 4, 5, 111]
20 print(li)   # 无global关键字,但函数体内可以对可变类型进行修改
21 # =>[1, 2, 3, 4, 5, 111]
  ② 无声明局部变量

  无声明局部变量:如果有对变量的操作,直接读取全局变量,不能对其赋值,只能读取

1 name = '李四'  # 不可变类型,全局变量
2 def what_name():   # 无global关键字,无局部变量声明,直接读取全局变量
3     print(name)
4 print(name)  # 此处打印全局变量,无局部变量声明,所以不对其进行修改
5 # =>李四
6 what_name()  # 此处进入函数what_name()内,无局部变量声明,直接读取全局变量name
7 # =>李四

  <2> 函数内有 global 关键字

  注意:global 变量,读取全局变量,局部变量与全局变量相同时,对其进行修改;若不相同时,函数体外部可以调用函数体内的局部变量。global 变量要放在声明变量的前面也就是上面,让global 先执行,在声明变量。

  ① 有声明局部变量
 1 name = '李四'  # 不可变类型,全局变量
 2 def what_name():   # 有global关键字,有局部变量声明
 3     global name    # 修改全局变量name,由'李四'变为‘张三’,不仅函数体可以使用,函数体外也可以使用。(注意前提:程序是从上而下执行,如果没有执行函数体内的代码块,则变量只为全局变量)
 4     name = '张三'   # 声明局部变量
 5     print(name)
 6 print(name)  # 此处因为还没有执行函数what_name()代码块,所以直接打印全局变量
 7 # =>李四
 8 what_name()  # 此处进入函数what_name()代码块内,局部变量name进行了声明变为‘张三’,将其变为全局变量,所以之后操作无论函数体内还是函数外变量name已发生了变化,变为‘张三’
 9 # =>张三
10 print(name)  # 此处由于前面执行了what_name()函数,局部变量name发生变化,变为全局变量,所以name改变,变为“张三”
11 # =>张三

  ② 无声明局部变量

1 name = '李四'  # 不可变类型,全局变量
2 def what_name():   # 有global关键字,无局部变量声明,直接读取全局变量
3     global name1    # 将name1变量变为全局变量,之后name1变量函数体内外皆可使用(前提:name1要想在函数体外使用,必须先执行函数体)
4     print(name)
5 print(name)  # 此处没有运行函数,直接打印全局变量
6 # =>李四
7 what_name()  # 此处进入函数what_name()代码块内,变量name没有发生变化,所以执行结果还是为全局变量的值
8 # =>李四
9 # print(name1)  # 报错!!!(name1在函数体what_name内,虽然global是全局变量,但没有对其进行赋值操作,所以无法打印,报错!)

6.嵌套函数

  嵌套函数:在一个函数中定义了另外一个函数  

  1)第1种

 1 NAME = '张三'  # 1
 2 def one():  # 2
 3     name = '一层函数' # 3
 4     print(name)  # 4
 5     def two():  # 5
 6         name = '二层函数'  # 6
 7         print(name)  # 7
 8         def three():  # 8
 9             name = '三层函数'  # 9
10             print(name)  # 10
11         three()  # 11
12         print(name)  # 12
13     two()  # 13
14     print(name)  # 14
15 one() # 15
16 # =>一层函数
17 # =>二层函数
18 # =>三层函数
19 # =>二层函数
20 # =>一层函数
21 
22 # 代码总体执行顺序:1->2(将整个代码块加载如内存)->15->3->4->5(加载入内存)->13->6->7->8(加载入内存)->11->9->10->12->14
23 # 打印结果执行顺序:4->7->10->12->14

  2)第2种

 1 name = '张三'
 2 def one():
 3     name = '李四'
 4     def one_one():
 5         global name   # global 声明全局变量
 6         name = '王二麻子'
 7     one_one()
 8     print(name)
 9 print(name)
10 # =>张三
11 one()
12 # =>李四
13 print(name)
14 # =>王二麻子
15 
16 name = '张三'
17 def one():
18     name = '李四'
19     def one_one():
20         nonlocal name   # nonlocal 声明上一级变量
21         name = '王二麻子'
22     one_one()
23     print(name)
24 print(name)
25 # =>张三
26 one()
27 # =>王二麻子
28 print(name)
29 # =>张三

  3)第3种

1 def father(name):
2     print('I am father %s'%(name))
3     def son():
4         print('I am son')
5     print(locals())   # 打印当前层的局部变量
6 father('alex')
7 # =>I am father alex
8 # =>{'name': 'alex', 'son': <function father.<locals>.son at 0x0000022AD8C85288>}

7.前向引用

  1)风湿理论

  风湿理论:函数即变量

  在函数使用之前必须要有定义,定义后才能使用

1 def one():
2     print(1)
3     two()
4 def two():
5     print(2)
6 one()
7 # =>1
8 # =>2

 8.递归函数

  1)递归函数

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

  2)递归函数特性

  • 必须有一个明确的结束条件
  • 每次进入更深一层递归时,问题规模相比上次都应有所减少
  • 递归效率不高,递归层次过多会导致栈溢出

  3)案例

  <1> 案例1

 1 import time
 2 person_list = ['张三','李四','王二麻子','刘五']
 3 def ask_way(person_list):
 4     print('-'*100)
 5     if len(person_list) == 0:
 6         return '无人知道路!'
 7     person = person_list.pop(0)
 8     if person == '王二麻子':
 9         return '王二麻子说:我知道路,沙坡头在中国宁夏中卫!'
10     print('你好!帅哥%s,请问一下沙坡头在哪里?'%person)
11     print('%s回答道:我不知道,你等着,我帮你问问%s'%(person,person_list))
12     time.sleep(1)
13     res = ask_way(person_list)
14     print('%s问的结果是:%s'%(person,res))
15     return res
16 res = ask_way(person_list)
17 print(res)
18 # =>----------------------------------------------------------------------------------------------------
19 # =>你好!帅哥张三,请问一下沙坡头在哪里?
20 # =>张三回答道:我不知道,你等着,我帮你问问['李四', '王二麻子', '刘五']
21 # =>----------------------------------------------------------------------------------------------------
22 # =>你好!帅哥李四,请问一下沙坡头在哪里?
23 # =>李四回答道:我不知道,你等着,我帮你问问['王二麻子', '刘五']
24 # =>----------------------------------------------------------------------------------------------------
25 # =>李四问的结果是:王二麻子说:我知道路,沙坡头在中国宁夏中卫!
26 # =>张三问的结果是:王二麻子说:我知道路,沙坡头在中国宁夏中卫!
27 # =>王二麻子说:我知道路,沙坡头在中国宁夏中卫!

  <2> 案例2

 1 def calc(n):
 2     print(n)
 3     if int(n/2) == 0:
 4         return n
 5     res = calc(int(n/2))
 6     return res
 7 calc(10)   # 不带返回值
 8 # =>10
 9 # =>5
10 # =>2
11 # =>1
12 print(calc(10))   # 带返回值
13 # =>10
14 # =>5
15 # =>2
16 # =>1
17 # =>1

9.匿名函数

  Python 采用 lambda 关键字创建匿名函数

  • lambda 只是一个表达式,函数体比 def 简单很多
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率

  1)语法

1 lambda x:x+1   # 匿名函数(格式):lambda 形参:返回值

  2)举例

 1 # 常规函数
 2 def calc(x):
 3     return x+1
 4 res = calc(10)
 5 print(res)
 6 # =>11 
 7 
 8 # 匿名函数
 9 lambda x:x+1   # 匿名函数(格式):lambda 形参:返回值
10 print(lambda x:x+1)   # 打印内存地址
11 # =><function <lambda> at 0x000001A4111E5318>
12 func = lambda x:x+1
13 print(func(10))
14 # =>11

10.编程的方法论

  1) 面向过程编程

   面向过程编程:找到解决问题的入口,按照一个固定的流程去模拟解决问题的流程。

  如:

  <1> 搜索目标,用户输入(配偶要求,按照要求到数据结构(字典)内检索合适的人群);

  <2> 表白:表白成功进入<3>,否则进入<2>;

  <3> 恋爱:恋爱成功进入<4>,否则返回<1>;

  <4> 见家长:家长同意进入<5>,家长说你是她失散多年的妹妹,返回<1>

  <5> 结婚。

  2)函数式编程

  函数式编程:函数式=编程语言定义的函数+数学意义的函数

  通俗讲,函数式就是用编程语言来实现数学函数,这种函数内对象是永恒不变的,要么参数是函数,要么返回值是函数;没有 for 和 while 循环,所有的循环都由递归实现,无变量的赋值(即不用变量去保存状态),无赋值即不改变。

  函数式编程的特征

  <1> 不可变数据

  • 不可变:不用变量保存状态,不修改变量

  例1:数学函数表达式:y = 2*x + 1,用函数实现

1 # 函数式编程:省去复杂的中间过程,但可读性较差
2 def calc(x):
3     return 2*x+1
4 
5 # 面向过程编程:细化过程,每一个过程都较为详细,可读性比较高,但教繁琐
6 def calc(x):
7     res = 2*x
8     res += 1
9     return res

  <2> 第一类对象

  第一类对象:函数即“变量”

  高阶函数两个特征(满足其一变为高阶函数):

  • 函数接收的参数是一个函数名
  • 返回值中包含函数名
 1 # 第1种:把函数当做参数传给另外一个函数
 2 def foo(n):
 3     print(n)
 4 def bar(name):
 5     print('my name is %s'%name)
 6 foo(bar('alex'))
 7 # =>my name is alex
 8 # =>None
 9 
10 
11 # 第2种:返回值中包含函数
12 def bar():
13     print('from bar')
14 def foo():
15     print('from foo')
16     return bar
17 n = foo()  # 运行foo()函数
18 # =>from foo
19 n()   # 运行foo()
20 # =>from bar
21 
22 def handle():
23     print('from handle')
24     return handle
25 h = handle()
26 # =>from handle
27 h()
28 # =>from handle

  <3> 尾调用优化(尾递归)

  尾调用:在函数的最后一步调用另外一个函数(最后一行不一定是函数的最后一步)

 1 # 第1种:函数bar在foo内为尾递归
 2 def bar(n):
 3     return n
 4 def foo(x):
 5     return bar(x)
 6 
 7 # 第2种:函数bar1和bar2在foo内均为尾调用,二者在if判断条件不同情况下都有可能作为函数的最后一步
 8 def bar1(n):
 9     return n
10 def bar2(n):
11     return n+1
12 def foo(x):
13     if type(x) is str:
14         return bar1(x)
15     elif type(x) is int:
16         return bar2(x)
17     
18 # 第3种:函数bar在foo内为非尾调用
19 def bar(n):
20     return n
21 def foo(x):
22     y = bar(x)
23     return y
24 
25 # 第4种:函数bar在foo内为非尾调用
26 def bar(n):
27     return n
28 def foo(x):
29     return bar(x)+1

 

Python内置函数

  1.abs():返回数字的绝对值。

  举例:

1 print(abs(-100))
2 # =>-100
3 
4 print(abs(250))
5 # =>250
6 
7 print(abs(78.4))
8 # =>78.4
View Code

  2.all():用于判断给定的可迭代参数 iterable 中的所有元素是否都为 TRUE,如果是返回 True,否则返回 False。元素除了是 0、空、None、False 外都算 True。

  all()函数等价于:

1 def all(iterable):
2     for element in iterable:
3         if not element:
4             return False
5     return True
View Code

  举例:

 1 a = all((1,0,2))
 2 print(a)
 3 # =>False
 4 b = all(['',121,'sf'])
 5 print(b)
 6 # =>False
 7 c = all({'':'I','':''})
 8 print(c)
 9 # =>False
10 d = all([12,23,45])
11 print(d)
12 # =>True
13 e = all([[],34,'ok',True])
14 print(e)
15 # =>False
16 f = all([{},78,'df'])
17 print(f)
18 # =>False
View Code

  3.any():用于判断给定的可迭代参数 iterable 是否全部为 False,则返回 False,如果有一个为 True,则返回 True。元素除了是 0、空、FALSE 外都算 TRUE。

  any() 函数等价于:

1 def any(iterable):
2     for element in iterable:
3         if element:
4             return True
5     return False
View Code

  举例:

 1 a = any((1,0,2))
 2 print(a)
 3 # =>True
 4 b = any(['',121,'sf'])
 5 print(b)
 6 # =>True
 7 c = any({'':'I','':''})
 8 print(c)
 9 # =>True
10 d = any([12,23,45])
11 print(d)
12 # =>True
13 e = any([[],34,'ok',True])
14 print(e)
15 # =>True
16 f = any([{},78,'df'])
17 print(f)
18 # =>True
19 g = any([[],'',0,False])
20 print(g)
21 # =>False
View Code

  4.bin():返回一个整数 int 或者长整数 long int 的二进制表示.0b表示二进制。

  举例:

1 a = bin(120)
2 print(a)
3 # =>0b1111000
View Code

  5.bool():用于将给定参数转换为布尔类型,如果没有参数,返回 False。

  举例:

1 a = bool(0)
2 print(a)
3 # =>False
4 b = bool([])
5 print(b)
6 # =>False
7 c = bool('I love you')
8 print(c)
9 # =>True
View Code

  6.bytes():将字符串转换为字节数。

  举例: 

1 a = 'I love you!!!'
2 print(bytes(a,encoding='utf-8'))
3 # =>b'I love you!!!'
4 print(bytes(a,encoding='utf-8').decode('utf-8'))
5 # =>I love you!!!
View Code

  7.chr():用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符,按照ASCII表进行转换。

  举例:

1 a = chr(50)
2 print(a)
3 # =>2
4 b = chr(78)
5 print(b)
6 # =>N
View Code

  8.dir():获取某一对象下的方法属性。

  举例:

1 a = dir(tuple)
2 print(a)
View Code

  9.dict():用于创建一个字典。

  举例:

1 a = dict()
2 print(a,type(a))
3 # =>{} <class 'dict'>
4 b = dict(a=12,b=23)
5 print(b,type(b))
6 # =>{'a': 12, 'b': 23} <class 'dict'>
View Code

   10.divmod():把除数和余数运算结果结合起来,返回一个包含商和余数的元组(a // b, a % b).可用于分页使用。

  举例:

1 a = divmod(10,3)  # 可用于分页,如制作网页时,总共有10条信息,1页只显示3条,可使用divmod()函数进行分页
2 print(a)
3 # =>(3, 1)
4 b = divmod(15,3)
5 print(b)
6 # =>(5, 0)
View Code

  11.enumerate():用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

  语法:

1 enumerate(sequence,[start = 0])

  参数:

  sequence:一个序列、迭代器或其他支持迭代对象

  start:下标起始位置

  举例:

1 a = ['张三','李四','王二麻子']
2 print(list(enumerate(a,1)))
3 # =>[(1, '张三'), (2, '李四'), (3, '王二麻子')]
4 b = {'name':'alex','age':18,'tel':'1234546'}
5 for i,o in enumerate(b.values(),1):
6     print(i,o)
7 # =>1 alex
8 # =>2 18
9 # =>3 1234546
View Code

  12.eval():①提取字符串中的数据结构;②可以将字符串中的数学运算进行计算。

  举例:

1 a = eval('2*7')
2 print(a)
3 # =>14
4 b = eval('[11,22,33]')
5 print(b[1],type(b))
6 # =>22 <class 'list'>
View Code

  13.filter():①用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。返回迭代器对象;②该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

  举例:

1 a = filter(lambda x:x%2==1,[1,2,3,4,5,6,7,8,9])  # 过滤出列表中的奇数
2 print(list(a))
3 # =>[1, 3, 5, 7, 9]
4 def func(x):
5     return x == True
6 b = [[],{},False,0,True,'',111]
7 c = list(filter(func,b))
8 print(c)
9 # =>[True]
View Code

  14.float():用于整数和字符串转换为浮点数。

  举例:

1 a = float(13)
2 print(a)
3 # =>13.0
4 b = float('78.4')
5 print(b)
6 # =>78.4
View Code

  15.format():用于字符串格式化。

  举例:

1 a = 'my name is {} ,age {}'.format('alex',18)
2 print(a)
3 # =>my name is alex ,age 18
4 b = 'my name is {name} ,age {age}'.format(name='alex',age=18)
5 print(b)
6 # =>my name is alex ,age 18
View Code

  16.frozenset():创建一个冻结的集合,冻结后集合不能再添加或删除任何元素。

  举例:

1 a = frozenset(range(1,10))
2 print(a)
3 # =>frozenset({1, 2, 3, 4, 5, 6, 7, 8, 9})
View Code

  17.hash():进行哈希运算。①可哈希的(不可变类型);②不可哈希的(可变类型),返回对象的哈希值。

  举例:

1 a = 'I love you'
2 print(hash(a))
3 # =>9013143733982312212
4 b = (1,2,3)
5 print(hash(b))
6 # =>2528502973977326415
7 c = 1
8 print(hash(c))
9 # =>1
View Code

  18.help():用于查看函数或模块用途的详细说明。

  举例:

1 print(help(list))   # 查看list的详细说明
View Code

  19.hex():十进制转换为十六进制(0x:十六进制)。

  举例:

1 # ---实例
2 a = hex(5)
3 print(a)
4 # =>0x5
5 b = hex(45)
6 print(b)
7 # =>0x2d
View Code

  20.oct():十进制转换为八进制(0o:八进制)。

  举例:

1 a = oct(12)
2 print(a)
3 # =>0o14
4 b = oct(111)
5 print(b)
6 # =>0o157
View Code

  21.id():获取对象的内存地址。

  举例:

1 a = id('i love you')
2 print(a)
3 # =>2232217431280
View Code

  22.globals():打印当前位置的全局变量。

  23.locals():打印当前位置的局部变量。

  24.input():输入。

  举例:

1 a = input('你的名字:')
2 print(a)
3 # =>你的名字:alex
4 # =>alex
View Code

  25.int():将一个字符串或数字转换为整型。

  举例:

1 a = '123'
2 print(int(a),type(a))
3 # =>123 <class 'str'>
4 b = 78.3
5 print(int(b),type(b))
6 # =>78 <class 'float'>
View Code

  26.len():返回对象(字符、列表、元组等)长度或项目个数。

  举例:

1 print(len('i love you'))
2 # =>10
3 print(len([1,2,3,4,5,6]))
4 # =>6
View Code

  27.list():用于创建列表。

  举例:

1 a = 'I love you'
2 print(list(a))
3 # =>['I', ' ', 'l', 'o', 'v', 'e', ' ', 'y', 'o', 'u
4 b = (1,2,3,4)
5 print(list(b))
6 # =>[1, 2, 3, 4]
View Code

  28.map():①根据提供的函数对指定序列做映射,返回迭代器对象;②第一个参数function以参数序列中的每一个元素调用function函数,返回包含每次function函数返回值的新列表。

  举例:

1 a = map(lambda x:x*100,[1,2,3,4,5,6,7,8,9])
2 print(list(a))
3 # =>[100, 200, 300, 400, 500, 600, 700, 800, 900]
4 def func(x):
5     return x**2
6 b = [12,13,14]
7 c = list(map(func,b))
8 print(c)
9 # =>[144, 169, 196]
View Code

  29.max():返回给定参数的最大值,参数可以为序列。

  举例:

1 print(max(12,32,45,23,50))
2 # =>50
3 print(max(['bs','fb','ok']))
4 # =>ok
View Code

  30.min():返回给定参数的最小值,参数可以为序列。

  举例:

1 print(min(12,32,45,23,50))
2 # =>12
3 print(min(['bs','fb','ok']))
4 # =>bs
View Code

  31.next():①返回迭代器的下一个项目;②next() 函数要和生成迭代器的iter() 函数一起使用。

  举例:

 1 a = 'Interesting'
 2 b = iter(a)
 3 print(next(b))
 4 # =>I
 5 print(next(b))
 6 # =>n
 7 print(next(b))
 8 # =>t
 9 
10 mes = iter([1,2,3,4,5])
11 while True:
12     try:
13         x = next(mes)
14         print(x)
15     except StopIteration:
16         break
17 # =>1
18 # =>2
19 # =>3
20 # =>4
21 # =>5
View Code

  32.ord():将一个字符转化为ASCII中相对应的数字。

  举例:

1 print(ord('!'))
2 # =>33
3 print(ord('a'))
4 # =>97
View Code

  33.pow(x,y,z): 两个参数幂运算,三个参数先取幂运算再除第三个参数所得出的余数。

  举例:

1 print(pow(10,3))
2 # =>1000
3 print(pow(15,2,2))
4 # =>1
View Code

  34.print():打印输出。

  举例:

1 print('Hello world!')
2 # =>Hello world!
View Code

  35.range():range(start,stop,step)可创建一个整数列表,一般用在for循环中。

  举例:

 1 a = range(1,10)
 2 print(a)
 3 # =>range(1, 10)
 4 b = range(2,25,3)
 5 print(b)
 6 # =>range(2, 25, 3)
 7 c = 'love'
 8 for i in range(1,3):
 9     print(i)
10 # =>1
11 # =>2
View Code

  36.reduce():①使用前需要导入模块“from functools import reduce”;②对参数序列中元素进行累积,返回运算结果数值;③函数将一个数据集合(链表、元组等)中的所有数据进行下列操作:用传给reduce中的函数function(有两个参数)先对集合中的第1、2个元素进行操作,得到的结果再与第三个数据用function函数运算,最后得到一个结果。

  举例:

1 from functools import reduce
2 print(reduce(lambda x,y:x+y,[12,13,14,15,16]))
3 # =>70
View Code

  37.reverse():用于反转列表中的元素。

  举例:

1 a = [234,45,123,34]
2 a.reverse()
3 print(a)
4 # =>[34, 123, 45, 234]
View Code

  38.reversed():返回一个反转的迭代器。

  举例:

1 a = 'love you'
2 print(list(reversed(a)))
3 # =>['u', 'o', 'y', ' ', 'e', 'v', 'o', 'l']
4 b = [234,76,34,89]
5 print(list(reversed(b)))
6 # =>[89, 34, 76, 234]
View Code

  39.round():返回浮点数x的四舍五入值。

  举例:

1 print(round(23.456))
2 # =>23
3 print(round(78.98))
4 # =>79
View Code

  40.set():创建一个无序不重复元素集合,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

  举例:

1 print(set('i love you'))
2 # =>{'v', 'l', 'o', 'e', ' ', 'i', 'y', 'u'}
3 print(set([12,23,43,56,12,87,23]))
4 # =>{43, 12, 23, 87, 56}
View Code

  41.slice():设置切片。

  举例:

 1 # 方法一:
 2 mes = 'interesting'
 3 print(mes[3:7])
 4 # =>eres
 5 
 6 # 方法二:
 7 mes = 'interesting'
 8 a = slice(3,7)   # 设置切片
 9 print(mes[a])
10 # =>eres
11 b = slice(1,10,2)   # 可设置步长
12 print(mes[b])
13 # =>neetn
View Code

  42.sorted():排序(从小到大),排序本质比较大小,不同类型数据不能排序。

  举例:

1 a = [12,43,54,11]
2 print(sorted(a))
3 # =>[11, 12, 43, 54]
View Code

  43.str():将对象转换为字符串。

  举例:

1 a = 12345
2 b = str(a)
3 print(b,type(b))
4 # =>12345 <class 'str'>
View Code

  44.sum():对系列进行求和计算。

  举例:

1 a = [12,43,54,11]
2 print(sum(a))
3 # =>120
View Code

  45.tuple():创建一个元组。

  举例:

1 a = 'interesting'
2 print(tuple(a))
3 # =>('i', 'n', 't', 'e', 'r', 'e', 's', 't', 'i', 'n', 'g')
4 b = [12,43,54,11]
5 print(tuple(b))
6 # =>(12, 43, 54, 11)
View Code

  46.type():返回数据的类型。

  举例:

1 print(type(111))
2 # =><class 'int'>
3 print(type('ok'))
4 # =><class 'str'>
5 print(type([11,22,33]))
6 # =><class 'list'>
7 print(type({'ok':''}))
8 # =><class 'dict'>
View Code

  47.zip():①拉链函数(左右一一对应);②用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。

  举例:

1 print(list(zip(('a','b','c'),(1,2,3))))
2 # =>[('a', 1), ('b', 2), ('c', 3)]
3 dic = {'name':'alex','age':24,'money':10000}
4 print(list(zip(dic.keys(),dic.values())))
5 # =>[('name', 'alex'), ('age', 24), ('money', 10000)]
View Code
posted @ 2020-05-04 12:50  星落……  阅读(232)  评论(0编辑  收藏  举报