第三章:函数基础
1. 函数
1.1 语法
def func():
语句1
语句2
语句3
- def后跟一个空格,冒号不能少,函数的语句首行缩进一致(TAB)
- 命名需要遵循规则,约定俗成,大驼峰一般用来给类命名
- 括号里参数可以有也可以没有
1.2 参数及return
参数:(定义同C)
- 形参:形式参数
- 实参:实际参数
return:
- 养成以return为函数结尾的习惯,如果没有return,则默认返回None
- 函数执行到return语句则无条件返回,不会再继续执行后面的语句
使用函数调用99乘法表实例
1
2
3
4
5
6def chengfa(row): for col in range(1,row+1): print( row * col,end = " ") print(" ") for row in range(1,10): chengfa(row)
return返回实例
1
2
3
4
5
6
7
8def func(person): print("我见到{0}了,但是{1}不理我".format(person,person)) return "我好失望" print("我也见到{0}了,{1}跟我打招呼了".format(person,person)) return "哈哈" p = "minjie" rst = func(p) print(rst)
1.3 help函数
作用:帮助查看函数文档
如果需要查看Print函数中某个参数的值,则可用:
help(print)
1.4 参数详解
参考资料
Python参考书籍:流畅的Python
参数分类:
- 普通参数
- 默认参数
- 关键字参数
- 收集参数(包括关键字收集参数)
1.4.1 普通参数
参数的位置和顺序都一一对应
def func(v1,v2):
语句
#调用函数
func(v1,v2)
1
2
3def func(p1,p2): print("我今天遇见{0},{1}跟我打招呼了".format(p1,p2)) func("xiaoming","daming")
1.4.2默认参数
- 调用的时候形参带有默认值
- 调动的时候函数没有对应形式参数赋值,则采用默认值
1
2
3
4
5
6def func(name = "xiaoming",age = 18,sex = "man"): if sex == "woman": print("hello everyone,I am {0},{1}岁,a cute girl".format(name,age)) else: print("hello everyone,I am {0},{1}岁,a strong boy".format(name,age)) func("woman")
结果:hello everyone,I am xiaoming,18岁,a cute girl
1.4.3 关键字参数
- 可以不用考虑参数的位置
- 语法
def func(p1=v1, p2=v2.....):
func_body
调用函数:
func(p1=value1, p2=value2.......)
例:
1
2
3def func(name = "xiaoming",age = 18, hobby = "basketball"): print("hello everyone, I am {0},今年{1}岁,我的爱好是{2}".format(name,age,hobby)) func(age = 18,name = "xiaohong")
结果:hello everyone, I am xiaohong,今年18岁,我的爱好是basketball
注:hobby没有赋值,则使用默认参数
1.4.4 收集参数
- 不能确定参数的个数
- 一般收集参数用args表示,约定俗成
1
2
3
4
5
6
7
8def func(*args): print("hello,各位同学大家好,我简单的说两句") print(type(args)) print("*" * 50) for item in args: #注: args后面没有括号 print(item) func("xiaoming","China","18","打篮球")
打印结果:
1
2
3
4
5
6
7
8hello,各位同学大家好,我简单的说两句 <class 'tuple'> ************************************************** xiaoming China 18 打篮球
——收集参数之关键字参数
— 以字典的形式存储、访问
— 比收集参数多一个*,
— 一般情况下用kwrags表示,约定俗成,即**
例:
1
2
3
4
5
6
7
8def func(**kwargs): print("大家好,我简单说两句") print(type(kwargs)) print("*" * 50) for k,v in kwargs.items(): #注意,此处为items,有s,不同与收集参数,没有复数形式 print(k,"_____",v) # 注意:中间的横线字符需要用双引号“”括起来,两个逗号不能少 fun("我叫小明","湖南人","今年18岁","喜欢打篮球")
结果:
1
2
3
4
5
6
7
8大家好,我简单说两句 <class 'dict'> ************************************************** name _____ 我叫小明 ad _____ 湖南人 age _____ 今年18岁 hobby _____ 喜欢打篮球
1.4.5 混合实例—普通参数、收集参数、关键字收集参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17def func(name,age,*args,hobby = "none",**kwargs): #普通参数 print("大家好,我简答的做一个自我介绍") print("我的名字是:{0},今年{1}岁了".format(name,age)) #收集参数 for item in args: #注意:args后面没有括号 print(item) if hobby == "none": print("我没有什么爱好") else: print("我的爱好是:") #关键字收集参数 for k,v in kwargs.items(): print(k,"____",v) func("xiaoming","23","很高兴认识大家","希望大家能够多多关照","我不是一个随便的人,但是随便起来根本不是人",hobby = "yes",hobby1 = "打篮球",hobby2 ="羽毛球",hobby3 ="乒乓球",hobby4 ="足球")
1.5 收集参数的解包问题
— 收集参数有时候在调用的时候需要加*来解包
例:
1
2
3
4
5
6def func(*args): for item in args: print(item) l = ["xiaoming","xiaohong","18sui","baskerball"] func(l)
结果:
1['xiaoming', 'xiaohong', '18sui', 'baskerball']
加入解包符之后:
1
2
3
4
5
6def func(*args): for item in args: print(item) l = ["xiaoming","xiaohong","18sui","baskerball"] func(*l)
结果:
1
2
3
4xiaoming xiaohong 18sui baskerball
### 同理,dict类型收集参数一样可以解包,但是
- 对dict类型进行解包
- 需要用两个星号进行解包 (还未弄懂dict类型的解包)
1.6 变量作用域(和C定义一致)
1 全局变量
- 在全局范围内都能使用
2 局部变量
- 只能在局部范围内使用
例:
1
2
3
4
5
6
7
8a = 100 def func(): #打印全局变量a print(a) b = 50 print(b) print(a) print(b)
结果:
- 100
- 然后会报错
原因:a是全局变量,b是在函数func里定义的局部变量
- global 可将局部变量变成全局变量
例:
1
2
3
4
5
6
7
8
9
10
11a = 100 def func(): #打印全局变量a print(a) global b b = 50 print(b) print(a) func() # 必须将调用的函数放在打印局部变量的前面,否则无法调用局部变量,为什么??? print(b)
结果:
100
100
50
50
1.7 golbals,locals函数
- 可通过golbals和locals函数显示全局变量和局部变量
- 两个函数都统称为内建函数
例:
1
2
3
4
5
6a = 3000 def func(c,d): e = 111 print("Locals={0}".format(locals())) func(100,200) print("Golbals={0}".format(globals()))
1结果:
Locals={'e': 111, 'd': 200, 'c': 100}
Golbals={'a': 3000}(注:应该是这个)
1.8 eval 和exec函数
1.8.1 eval函数
- 将字符串当做表达式来执行,最后返回执行表达式的结果
1
2
3
4a = 100 b = 100 c = eval("a + b") print(c)
结果:200
1.8.2 exec函数
- 功能和eval相似,但是不返回结果
1
2
3
4
5
6a = 100 b = 100 c = a + b d = exec("print('a + b =',a +b)") print(c) print(d)
结果:
1
2
3a + b = 200 200 None
1.9 递归函数
- 函数直接或者简介的调用自己
- 优点:简洁
- 缺点:对递归深度有限制,消耗资源多
- Python 会递归函数有限制,超过限制会报错
- 一定要注意函数结束的条件
例:用递归函数实现斐波那契数列
f(1)=1,f(2)=1,f(3)=2,f(4)=3,f(5)=5,……………………,f(n)=f(n-1)+f(n-2)
1
2
3
4
5
6
7
8
9
10def func(n): if n == 1 or n == 2: return 1 else: return func(n-1) + func(n-2) n = input("请输入n的值:") n = int(n) v = func(n) print(v)
例:用递归函数解决汉诺塔问题
汉诺塔:
- 有A,B,C三座塔,A上有从上至下,从小打到顺序排列的圆圈,通过一定的移动将A上的圆圈移动至C上
规则:
- 每次只能移动一个盘子
- 每次移动都要保证小圆圈在上,大圆圈在下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22def hann(n,a,b,c): if n == 1: print(a,"-->",c) return None ''' if n == 2: print(a,"-->",b) print(a,"-->",c) print(b,"-->",c) return None ''' #一般情况下都会写到n=2,n=3的情况下,可以看出用Python写出来非常简短 #如果n>3,将a上的n-1个圆圈借助c,放到辅助柱子b上,具体怎么放不管 hann(n-1,a,c,b) #再通借助柱子a,将b上的n-1个圆圈放到柱子c上,即为完成任务 hann(n-1,b,a,c) a = "A" b = "B" c = "C" n = input("请输入圆圈数量:") n = int(n) hann(n,a,b,c)
最后
以上就是典雅小霸王最近收集整理的关于Python入门笔记—第三章【函数】第三章:函数基础的全部内容,更多相关Python入门笔记—第三章【函数】第三章内容请搜索靠谱客的其他文章。
发表评论 取消回复