Python 学习之路-04 函数
程序员文章站
2024-02-24 14:26:34
...
函数
- 代码的一种组织形式
- 一个函数完成一项特定的功能
- 函数的定义
- 使用def 关键字来定义函数
- 使用函数俗称调用
- 函数的调用
- 直接使用函数名后面加上括号(),根据函数是否带有参数,如果有参数则在调用时需要传递参数
# 定义一个函数
# 只是定义的话不会执行
def func():
print("我是一个函数")
print("我要完成一个功能")
print("我已经结束了")
#函数的调用
func()
我是一个函数
我要完成一个功能
我已经结束了
函数的参数和返回值
- 参数:负责给函数传递一些必要的数据或信息
- 返回值:函数的返回结果
参数的使用
- 在调用函数时向函数传递的一个值
- 形参: 在函数定义的时候没有具体的值,只是一个占位符
- 实参:在调用函数的时候输入实际的值
- 参考资料:(http://www.cnblogs.com/bingabcd/p/6671368.html)
- 参数类型
-
普通参数
定义的时候直接定义变量名
-
调用的时候直接把变量或直接放入指定为准
def 函数名(参数1,参数2,.....) 语句块 # 调用 函数名(value1,value2,.......)
-
默认参数
-
形参代用默认值,如果调用的时候没有对形参进行赋值,那么就使用默认值
def func_name(p1=v1,p2=v2,......) 语句块 #调用 func_name() #调用2 func_name(100,200)
-
-
关键字参数
-
语法
def func_test(p1=value,p2=value2,.....): funcBody #调用 func_test(p1="zhangsan",p2="18",.......)
在参数多的情况下,不容易混淆
在使用关键字参数的时候,不用考虑参数的位置
-
-
收集参数
把没有位置,不能够定义是的参数位置相对应的参数,放入一个特定的数据结构中
-
语法
def func_test(*ages):
funcBody#调用 func(val1,val2,val3.....)
参数名没有强制要求,但是推荐使用ages
参数名ages 前面必须加入*号
收集参数和其他参数可以共存
-
收集该参数之关键字参数
把关键字参数按字典格式存入收集参数
-
语法
def func( **kwages): funcBody #调用 func(p1=v1,p2=v2,.......)
kwage是通常的约定
调用时,吧多余的关键字参数放入kwages
访问kwages时,需按照字典格式进行访问
-
- 参数类型
# 参数的定义和使用
def hello(person):
print("{0}!你肿么了?".format(person))
print("Sir,你不理我我就走了哦.....")
# 向调用者返回一个值
return "你走开!"
p = "明月"
# 获取返回值
ret = hello(p)
print(ret)
明月!你肿么了?
Sir,你不理我我就走了哦.....
你走开!
# 打印一行乘法表
def multiplication(row):
for col in range(1,row+1):
ji = col * row
print("{0}*{1}={2}".format(col,row,ji),end=" ")
print("")
# 打印99乘法表
for row in range(1,10):
multiplication(row)
1*1=1
1*2=2 2*2=4
1*3=3 2*3=6 3*3=9
1*4=4 2*4=8 3*4=12 4*4=16
1*5=5 2*5=10 3*5=15 4*5=20 5*5=25
1*6=6 2*6=12 3*6=18 4*6=24 5*6=30 6*6=36
1*7=7 2*7=14 3*7=21 4*7=28 5*7=35 6*7=42 7*7=49
1*8=8 2*8=16 3*8=24 4*8=32 5*8=40 6*8=48 7*8=56 8*8=64
1*9=9 2*9=18 3*9=27 4*9=36 5*9=45 6*9=54 7*9=63 8*9=72 9*9=81
#默认参数案例
def reg(name,age,gender="male"):
if(gender=="male"):
print("{0} is {1},and he is a good student".format(name,age))
else:
print("{0} is {1},and she is a good student".format(name,age))
reg("zhagnsan",18)
reg("xiaojing",17,"female")
zhagnsan is 18,and he is a good student
xiaojing is 17,and she is a good student
#关键字参数案例
def func_student(name="NO Name", age=0, addr="中国"):
print("我是一个学生!")
print("我叫{0},我今年{1}岁了,我住在{2}".format(name,age,addr))
func_student(age=22, name="张三", addr="成都")
我是一个学生!
我叫张三,我今年22岁了,我住在成都
收集参数混合调用的顺序问题
- 收集参数,关键字参数,普通参数可以混合使用
- 使用规则就是,普通参数和关键字参数优先
- 定义的时候一般找普通参数,关键参数,收集参数tuple,收集参数Dictionary
# 收集参数案例
def func_student(*ages):
print("Hello 大家好!")
# type函数 检测数据的类型
#print(type(ages))
for item in ages:
print(item)
func_student("张三", 18, "北京市大通区", "wangxiaoj", "single")
func_student("李四", 22, "我喜欢电影")
# 说明收集参数可以为空
func_student()
Hello 大家好!
张三
18
北京市大通区
wangxiaoj
single
Hello 大家好!
李四
22
我喜欢电影
Hello 大家好!
#收集参数之关键字参数案例
def stu( **kwages):
print("Hello! 大家好,我先自我介绍一下:")
#在循环字典的时候,将字典转换成键值队的方式 即 key:value的形式
for k,v in kwages.items():
print(k, "...", v)
stu(name="wangxiaoj", age=19, addr="北京市大通州区", love="xiaojinjin", work="Teacher")
# 将*号重复20遍
print("*" * 20)
stu(name="周伯通")
#同样 参数可以为空
stu()
Hello! 大家好,我先自我介绍一下:
name ... wangxiaoj
age ... 19
addr ... 北京市大通州区
love ... xiaojinjin
work ... Teacher
********************
Hello! 大家好,我先自我介绍一下:
name ... 周伯通
Hello! 大家好,我先自我介绍一下:
#收集参数混合使用的案例
#使用默认参数时,注意默认参数的位置要在args之后kwargs之前
def stu(name, age, *ages, hobby="没有", **kwages):
print("Hello 大家好!")
print("我叫{0}, 我今年{1}岁了!".format(name,age))
if hobby=="没有":
print("sorry!我没有爱好!!")
else:
print("我的爱好是{0}".format(hobby))
print("我不喜欢")
for item in ages:
print(item,end=" ")
print("我的主修课是:")
for k,v in kwages.items():
print(k,"---",v)
stu("李晓明", 20)
print("*" * 30)
stu("王晓静", 22, "逛街", "购物", "上网", "游戏", hobby="音乐", course="音乐课", score=98)
Hello 大家好!
我叫李晓明, 我今年20岁了!
sorry!我没有爱好!!
我不喜欢
我的主修课是:
******************************
Hello 大家好!
我叫王晓静, 我今年22岁了!
我的爱好是音乐
我不喜欢
逛街 购物 上网 游戏 我的主修课是:
course --- 音乐课
score --- 98
收集参数的解包的问题
- 把参数放入list中或者字典中,直接吧list/dictionary中的值放入收集参数中
- 解包符号
- 对与list\tuple的解包在调用函数的时候,在参数前面加上*即可
- 对dictionary的解包在参数前面加上**即可
# 解包的案例
def stu(*ages):
print("哈" * 10)
for index in ages:
print(index)
l = list()
l.append("wangxiaojing")
l.append(18)
l.append("apple")
stu(l)
print("***" * 10)
#解包list的调用方法
stu(*l)
哈哈哈哈哈哈哈哈哈哈
['wangxiaojing', 18, 'apple']
******************************
哈哈哈哈哈哈哈哈哈哈
wangxiaojing
18
apple
返回值
- 使用return向函数的调用者返回函数需要向调用者返回的数据
- 如果没有return,默认返回None
- 函数只要执行到了return,无条件返回数据,如果函数在return后面还有代码的话,则不在执行
- 推荐写法,无论有无返回值,都应该加上return,以表示函数结束!
# 返回值案例
def func1():
print("我有返回值!")
return 1
def func2():
print("我没有返回值")
f1 = func1()
print(f1)
print("")
f2 = func2()
print(f2)
我有返回值!
1
我没有返回值
None
函数文档
- 函数的文档的作用是对当前函数提供使用的相关功能的参考信息
- 文档的写法
- 在函数内部开始的第一行使用三个单引号定义
- 一般具有特定的格式
- 文档查看
- 使用help函数,如:help(test)
- 使用doc,如:test.doc
#函数文档案例
def stu(name, age, *ages):
'''这是stu文档'''
print("这是一个函数文档")
stu.__doc__
'这是stu文档'
# 查找函数的帮助文档
#1.使用help文档
help(print)
Help on built-in function print in module builtins:
print(...)
print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
flush: whether to forcibly flush the stream.
上一篇: java数据结构之java实现栈