函数
(一)定义
1.1 函数的概念:
1.函数:把具有独立功能的代码块组织成一个小模块,在需要的时候调用。
2. 使用步骤:定义函数——封装独立的功能;调用函数——享受封装的成果。
1.2 函数的分类:
- 内建函数,如 max()、reversed() 等
- 库函数,如 math.ceil() 等
- 自定义函数,使用 def 关键字定义
1.3 定义函数:
def 函数名(参数列表):
函数体(函数封装的代码)
[return 返回值]
- 函数名命名符合标识符命名规则
- 定义函数时的参数列表又称形参列表
- return用来返回函数执行结果。如果没有返回值,默认为None。
- python可以间接返回多个值(返回一个元组)。
- 一旦遇到return,函数执行结束,后面的代码不会执行。
1.4 作用域:
-
局部变量:
局部变量是在函数内部定义的变量,只能在函数内部使用
函数执行结束后,函数内部的局部变量,会被系统回收
不同的函数可以定义相同名字的局部变量,不会相互影响 -
全局变量:
在函数外部定义的变量,(没有定义在某一个函数内),所有函数内部都可以使用这个变量
x=9
print 'outside:',id(x) #使用id(x)来查看变量在内存中地址,具有惟一性
def fun():
global x # 声明a为全局变量
x = 6
print 'inside:',id(x)
fun()
print x
print id(x)
outside: 36670568 ##输出结果
inside: 36670472
5
36670472##使用全局变量,函数的值在经过函数的计算之后记录新值,在函数内部重新赋值之后,函数执行完后不被系统内存回收。
1.5 引用对象:
在python中函数的参数传递和返回值都是靠引用传递的。
变量和数据是分开存储的,数据存储在内存中的某一位置上,变量记录的是数据在内存中的地址,即引用。
id()函数可查看变量中保存数据在内存中的地址。
(二)参数传递:
-
实参: 调用函数时使用,小括号中的参数,是用来把数据传地到函数内部的
-
形参: 定义函数时,小括号中的参数是用来接收参数使用的,在函数内部当作变量来使用的。形参可以任意命名。
-
可变参数: ——通过指针传递——对象引用——原地修改
-
不可变参数: ——通过值传递——对象引用——不会原地修改
2.1 关键字参数:
使用形参的名字来传入实参,参数的顺序无关,变量名与输入一一对应即可。(关键字参数必须在位置参数、默认参数之后) 。允许在调用时以字典形式传入0个或多个参数。在传递参数时用等号(=)连接键和值。
2.2 位置参数:
按照参数位置,依次传递参数。形参、实参个数必须保持一致。
2.3 默认参数:
形参、实参个数可以不一致,默认参数可以被改变。但定义默认参数时,必须指向不变对象。
2.4 可变参数:
允许在调用参数的时候传入多个(≥0个)参数(类似于列表、字典)。
1. 可变位置参数: 形参前加 *,将收集到的多个参数组织到一个tuple中
2. 可变关键字参数: 形参前加 *,将收集到的关键字参数组织到一个dict中
3. keyword-only 参数: 又称“命名关键字参数”。在形参定义时,在一个 == 星号或一个可变位置参数之后,出现的普通参数,已经不是普通参数,而成为keyword-only。此时可变位置参数截获了所有位置参数,其后面的keyword-only参数不能通过位置传参,只能通过关键字传参==。
4. 可变关键字参数应放在可变位置参数后,可变参数应放在普通参数后
一般顺序: 普通参数,缺省值,可变位置参数,keyword-only参数(可带缺省值),可变关键字参数
参数解构: 在给函数提供实参时,在可迭代对象前用*或**进行解构,提取出其中的所有元素作为函数的实参。
def add(*iterable):
result = 0
for x in iterable:
result += x
return result
add(1,2,3)
add(*[1,3,5]) ##用*解构位置传参
add(*range(5)) ##用**解构关键字传参
(三)常用函数
3.1 输入输出函数:
- print()函数:
print("hello","world") ##输出多个字符串,用逗号隔开,逗号输出为空格
print("hello"+"world") ##字符串相加连接,不产生空格
print(10+30) ##没有使用引号括起来,默认为数值,进行表达式计算,返回计算结果
##若数字用引号括起来,则为字符串
print("hello"+1) ##报错,不同类型的数据不能使用+号连接
print("hello",1) ##正确,不同类型的数据可以使用,号连接
print("1 2 3 ",2+3) ##字符串原样输出,算术表达式返回计算结果
##print()之后默认换行,end()函数可实现不换行
##print(布尔表达式)输出Ture,False
- input()函数:
name = input() ##用户输入字符串,并存放在变量中
name = input("please enter your name : ") ##带有提示信息的输入
3.2 二进制转换函数:
- bin(),oct(),hex()进制转换函数(带前缀):
###返回值均为字符串,且带有前缀0b,0o,0x
###十进制转二进制
>>> bin(10)
>'0b1010'
###十进制转八进制
>>> oct(12)
>'014'
###十进制转十六进制
>>> hex(12)
>'0xc'
###hex()函数比格式化字符串函数format()慢,不推荐使用
- ’{0:b/0/x}’.format()进制转换函数(不带前缀):
###十进制转二进制
>>>'{0:b}'.format(10)
>'1010'
###十进制转八进制
>>>'{0:o}'.format(12)
>'14'
###十进制转十六进制
>>>'{0:x}'.format(12)
>'c'
- int(’ ',2/8/16)转十进制函数(不带前缀):
###二进制转十进制
>>> int('1010',2)
>'10'
###八进制转十进制
>>> int('014',8)
>'12'
###十六进制转十进制
>>> int('0xc',16)
> '12'
- ’{0:d}’.format()转十进制函数:
###二进制转十进制
>>> '{0:d}'.format(0b11)
> '3'
###八进制转十进制
>>> '{0:d}'.format(0o14)
> '12'
###十六进制转十进制
>>> '{0:d}'.format(0x1f)
> '31'
- eval()转十进制函数:
eval()函数比int()函数慢
###二进制转十进制
>>> eval(0b11)
> '3'
###八进制转十进制
>>> eval(0o14)
> '12'
###十六进制转十进制
>>> eval(0x1f)
> '31'
3.3 求数据类型函数:
- type()函数:
n = type(a)
- isinstance()函数:
判断变量是否属于某一数据类型,可以判断子类是否属于父类
str1 = 'ss'
print(isinstance(str1,str))
>True
3.4 关键字函数:
keywords.kwlist()函数:
import keyword
print(keyword.kwlist)
输出:
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
3.5 数学函数:
函数 | 功能 |
---|---|
abs(num) | 返回num绝对值 |
max(num1,……numn) | 返回最大值 |
pow(x,y) | 求x^y |
round(num,n) | 四舍五入(n默认为0) |
3.6 字符串函数:
- eval(str)函数:
将字符串转成有效的表达式来求值或者计算结果。可以将字符串转化成列表list,元组tuple,字典dict,集合set。生成一个新的字符串,没有改变原本的字符串
str1 = "12-3"
print(eval(str1))
print(str1)
print(eval("[1,2,3,4]"))
print(type(eval("[1,2,3,4]")))
print(eval("(1,2,3,4)"))
print(eval('{1:1,2:2,3:3}'))
print(eval('{2,3,5,3}'))
> 9
> 12-3
> [1, 2, 3, 4]
> <class 'list'>
> (1, 2, 3, 4)
> {1: 1, 2: 2, 3: 3}
> {2, 3, 5}
- ord()求ASCLL码值函数:
print(ord("a"))
> 97
- chr()数字转ASCLL码值函数:
print(chr(97))
> a
- max(str),min(str)获取str最大最小字符:
- str.encode(编码格式):
编码:str.encode()
解码:str.encode().decode()
注意:encode()的编码格式与decode()的编码格式必须保持一致
str4 = "你好吗"
print(str4.encode())
print(str4.encode().decode())
print(str4.encode("gbk"))
print(str4.encode("gbk").decode("gbk"))
> b'\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x90\x97'
> 你好吗
> b'\xc4\xe3\xba\xc3\xc2\xf0'
> 你好吗
3.7 栈与队列
1、栈 stack ——后进先出
mystack=[]
###压栈
mystack.append(1)
###出栈
mystack.pop()
2、 队列 queue ——先进先出
#导入数据结构的集合
import collections
queue = collections.deque([1, 2, 3, 4, 5])
print(queue)
#入队[存数据]
queue.append(8)
print(queue)
queue.append(9)
print(queue)
#取数据
print(queue.popleft())
print(queue)