函数就是一大堆代码,给这一大堆代码起个名字,方便调用。比如:
1 | def 函数名(): |
比如,可以定义为一个发邮件的函数:
1 | # 发邮件 |
函数的参数在传递时,本质上传递的是内存地址(引用),不会重新拷贝一份再传递。
而函数内部在操作数据时,是重新生成数据还是修改原数据,取决于参数的数据类型是否是可变的。
1 | # 可变类型:列表、字典、集合 |
当函数同时执行时,会为每个执行的函数创建一块内存(调用栈),因此数据不会混乱
1 | # 定义函数时,括号里可以包括一些参数,称为形式参数 |
函数参数的传递方法有三种,按位置传参,按关键字传参和混合传参
1 | # 按位置传参 |
1 | # 按关键字传参 |
1 | # 混合传参 |
另外,函数在定义时,也可以指定默认参数,若没有实参传入时,就使用默认参数。比如:
1 | def func(a1,a2=2,a3=3): # 需要注意含有默认参数的关键字必须放在后面 |
定义函数时,可以不限制参数的个数
*
,比如:1 | def func(*args): #用户传来的参数都会被打包成元组的类型,按照位置传参 |
**
,比如:1 | def func(**kwargs): # 用户传来的参数会被打包成字典的类型,必须以关键字的形式传参 |
*
和 **
混合使用,比如:1 | def func(a1,a2,a3,*args,**kwargs): #静态参数必须放到动态参数前面,*必须放到**前面 |
潜规则:含有动态参数的函数在定义时,形参的变量名一般使用*args
和**kwargs
定义一个函数,希望它产生一个结果,可以用到返回值。调用函数时,可以用一个变量来接收这个返回值。
返回值可以是任意类型。如果返回一组分散的变量,则会打包成元组。如果没有返回值,默认返回None。
在函数运行过程中 ,遇到return()
会立即结束运行并返回值。
python
中的变量分为全局变量和局部变量。(在定义全局变量时用大写,定义局部变量时用小写,多个单词用下划线连接。)
全局变量:在python
文件顶层中定义的变量,python
具有一个全局作用域,只要python
代码运行,就在此全局作用域中运行。
局部变量:在函数中定义的变量,python
中以函数为作用域,执行一个函数,就会为函数创建一个作用域。
寻找变量的值时,优先从自己的作用域中寻找,没有的话就从父级作用域中找。
如果要在函数中修改和使用全局变量,可以使用global
关键字,表明此变量不是新创建的变量,而是指向全局变量。比如:
1 | NAME = "张三" |
1 | NAME = "张三" |
函数名代指这个函数,函数名后加(),会执行函数。
函数名也可以理解为一个变量名,比如:
1 | def func(): |
函数名和函数都可以放到列表中,比如:
1 | def func(): |
函数名还可以放到列表中,当作字典中的值,比如:
1 | def func(): |
一个函数的函数名可以作为参数传入另一个函数中,比如:
1 | def do(): |
使用lambda
表达式,可以用一行代码实现简单的函数,比如:
1 | def func(): |
1 | def func(a1,a2): |
1 | def func(data_list): |
内置函数是python内部已经编写好的函数,可以直接拿来用。
abs()
,绝对值
1 | data = abs(-10) # data = 10 |
pow()
,次方
1 | data = pow(2, 5) # data = 32,pow(a,b)就是求a的b次方 |
sum()
,求和
1 | num_list = [1,2,3,4] |
divmod()
,商和余数
1 | v1,v2 = divmod(92,10) |
round()
,保留小数点后几位
1 | data = round(3.1415926, 2) |
max()
和min()
,求最大值和最小值
1 | num_list = [2,34,-1,26] |
all()
和any()
,判断列表中的元素所转化的布尔值
1 | data_list1 = [1,4,"",0,"cczu"] |
二进制以0b
开头、八进制以0o
开头、十六进制以0x
开头,都是字符串形式
十进制可以转换为二进制、八进制、十六进制。比如:
bin()
、oct()
、hex()
1 | num = 123 |
其他进制也可以通过int()
转换为十进制数,比如:
1 | int("0b1111011",base=2) # 123 2进制转化为10进制 |
在unicode
编码中,每个字符都是由2进制来存储的,这个2进制数可以转化为10进制数,因此字符与10进制数也有对应关系。
ord()
,将字符转化为10进制数
1 | num = "A" |
chr()
,将10进制数还原为字符
1 | chr(65) # A |
基于chr
函数,可以实现随机验证码的功能
1 | import random |
之前已经提及,将一种数据类型转化为另一种数据类型,包括:
1 | int() str() list() tuple() dict() bool() bytes() set() float() |
之前已经提及的,比如以下等,不详细列举
print()
,输出input()
,输入len()
,求长度open()
,打开文件未曾提及的,以下:
range()
,生成一个数字列表
1 | range(4,9) # [4,5,6,7,8] 前后两个数字与索引的方法类似,从0计数,前取后不取 |
range()
函数可以与for
循环结合使用
hash()
,计算哈希值(字典和集合的值都必须是可哈希的)
type()
,查看数据类型
1 | print(type("邓胖胖")) # str |
callable()
,判断一个变量名是否可执行
1 | name = "张三" |
enumerate()
,在循环中提供自增的一列
1 | 用法:enumerate(iterable, start=0) |
sorted()
,对列表、元组、集合进行排序
1 | data_list = [13,8,3,56,-1,] |
1 | # 有时默认规则并不能得到理想的顺序,sorted()支持自定义排序,比如: |