函数
内置函数
- 截⽌到python版本3.6.2,现在python⼀共为我们提供了68个内置函数
abs() | dict() | help() | min() | setattr() |
---|---|---|---|---|
all() | dir() | hex() | next() | slice() |
any() | divmod() | id() | object() | sorted() |
ascii() | enumerate() | input() | oct() | staticmethod() |
bin() | eval() | int() | open() | str() |
bool() | exec() | isinstance() | ord() | sum() |
bytearray() | filter() | issubclass() | pow() | super() |
bytes() | float() | iter() | print() | tuple() |
callable() | format() | len() | property() | type() |
chr() | frozenset() | list() | range() | vars() |
classmethod() | getattr() | locals() | repr() | zip() |
compile() | globals() | map() | reversed() | __import__() |
complex() | hasattr() | max() | round() | |
delattr() | hash() | memoryview() | set() |
自定义函数
格式
def func1():
# 示例函数
print('hello')
return 0
func1()
函数传参
- 实参:实际要交给函数的内容,如下面的1,2,3
- 形参:在定义函数时只是一个形式,表示这里有一个参数,如下面的a,b,c
- 位置参数(实参与形参位置应该一一对应)
def func1(a, b, c):
# 示例函数
print('传入的第一个参数{}'.format(a))
print('传入的第二个参数{}'.format(b))
print('传入的第三个参数{}'.format(c))
return 0
func1(1, 2, 3)
#执行结果
传入的第一个参数1
传入的第二个参数2
传入的第三个参数3
- 关键字参数(可以调整顺序)
def func1(a, b, c):
# 示例函数
print('传入的第一个参数{}'.format(a))
print('传入的第二个参数{}'.format(b))
print('传入的第三个参数{}'.format(c))
return 0
func1(b=10, a=20, c=30)
#执行结果
传入的第一个参数20
传入的第二个参数10
传入的第三个参数30
- 默认参数(缺省参数):有默认值的参数,不传参使用默认值,传参使用传入值
def ssh_connect(host, user='root', port=22):
print("ssh {}@{} -p {}".format(user, host, port))
ssh_connect("192.168.139.10")
ssh_connect("192.168.139.10", "zhangsan")
ssh_connect("192.168.139.10", "zhangsan", 8080)
#执行结果
ssh root@192.168.139.10 -p 22
ssh zhangsan@192.168.139.10 -p 22
ssh zhangsan@192.168.139.10 -p 8080
- 可变长参数:可以传入不定个数的参数
#求和
def add_num(*args):
sum = 0
for i in args:
if isinstance(i, int):
sum += i
print(sum)
add_num(1,2,4,"a")
#执行结果
7
- 多个关键字参数转字典
def func1(*args, **kwargs):
print(args, type(args))
print(kwargs, type(kwargs))
func1("a", 1, [1, 2, 3],{"name":"zhansan", "age":15},name="zhansan",age=12)
#执行结果
('a', 1, [1, 2, 3], {'name': 'zhansan', 'age': 15}) <class 'tuple'>
{'name': 'zhansan', 'age': 12} <class 'dict'>
args:接收除键值对以外的所有参数,转化为元祖形式
kwargs:只接受键值对,转化为字典形式
函数返回值
- return:返回。可以用return返回函数运行的结果,赋值给变量,方便后续调用
- 一旦遇到return,立即结束函数
- 不写return,会默认返回一个None
- 案例:
def add_num(*args):
sum = 0
for i in args:
if isinstance(i, int):
sum += i
return(sum)
add = add_num(1,2,4,"a") #传参调用函数,函数返回sum的值;将sum又赋给了变量add,方便下面调用
if add > 10:
print("大于10")
else:
print("不大于10")
#执行结果
不大于10
函数要先定义,才能调用
定义函数:就是在内存中开辟一块空间,存放函数体内的代码,通过函数名来调用
函数名的本质就是函数的内存地址
调用函数就是执行函数体内的代码
函数的变量作用域
- 全局变量:代码在运行伊始,默认开辟空间,全局有效
- 局部变量:在函数运行时开辟的临时空间,只在函数内部生效
name = "zhangsan" #全局变量
def func1():
age = 18 #局部变量
print(name)
print(age)
func1()
print(name)
print(age)
#执行结果
zhangsan
18
zhangsan
Traceback (most recent call last):
File "D:/2021-11-18创建python/函数.py", line 41, in <module>
print(age)
NameError: name 'age' is not defined
递归函数
-
递归:在⼀个函数⾥再调⽤这个函数本身
-
递归的最⼤深度为997
-
案例:汉诺塔问题
-
从左到右 A B C 柱 ⼤盘⼦在下, ⼩盘⼦在上, 借助B柱将所有盘⼦从A柱移动到C柱, 期间只有
⼀个原则: ⼤盘⼦只能在⼩盘⼦的下⾯.
如果有64层,先将A柱上的63层移动到B柱上,然后将A柱的第64个移动到C柱 上,然后将B柱上的63层移动到C柱上即可。 那怎么把63层都移到B柱上,这个问题可以⽤上⾯相同的⽅法解决
-
def move_game(n, a, b, c):
if n == 1:
print(a, '->', c)
else:
# 将n-1个盘子从a --> b
move_game(n-1, a, c, b)
# 将剩余的最后一个盘子从a --> c
print(a, '->', c)
# 将剩余的n-1个盘子从 b --> c
move_game(n-1, b, a, c)
n = int(input('请输入汉诺塔的层数:'))
move_game(n, 'A', 'B', 'C')
#执行结果
请输入汉诺塔的层数:4
A -> B
A -> C
B -> C
A -> B
C -> A
C -> B
A -> B
A -> C
B -> C
B -> A
C -> A
B -> C
A -> B
A -> C
B -> C