函数
- 代码的一种组织形式
- 一个函数一般完成一项特定的功能
- 函数使用
- 函数需要先定义
- 使用函数,俗称调用
# 定义一个函数
# 只是定义的话不会执行
# 1、def关键字,后跟一个空格
# 2、函数名,自己定义,起名需要遵循命名规则,约定俗成,不用大驼峰(只给类用)
# 3、后面括号和冒号不能省,括号内可以有参数
# 4、函数内所有代码缩进
def func():
print("我是一个函数")
print("我要完成一定功能")
print("我结束了")
# 函数调用
# 直接函数名后面跟括号
func()
我是一个函数
我要完成一定功能
我结束了
参数的定义和使用
- 参数:负责给函数传递一些必要的数据或者信息
- 形参(形式参数):在函数定义的时候用到的参数没有具体值,只是一个占位符号,成为形参
- 实参(实际参数):在调用函数时输入的值
- 返回值:函数的执行结果
- 使用return关键字
- 如果没有return,默认返回一个None
- 函数一旦执行return,则无条件结束函数执行
# 参数的定义是使用
# 参数的person只是一个符号,代表队黑色调用的时候的某一个数据
def hello(person):
print("{0}, 你肿么了".format(person))
print("sir, 你不理睬额额就走了")
p = "明月"
hello(p)
###################################
明月, 你肿么了
sir, 你不理睬额额就走了
# return语句的使用
# 函数打完招呼后返回一句话
def hello(person):
print("{0}, 你肿么了".format(person))
print("sir, 你不理睬额额就走了")
return "我已经跟{0}打招呼了,{0}不理我".format(person)
p = "明月"
print(hello(p))
###########################################
明月, 你肿么了
sir, 你不理睬额额就走了
我已经跟明月打招呼了,明月不理我
# return案例2:无条件结束
def hello(person):
print("{0}, 你肿么了".format(person))
return "哈哈,我提前结束了"
print("sir, 你不理睬额额就走了")
p = "明月"
print(hello(p))
######################################
明月, 你肿么了
哈哈,我提前结束了
# 查找函数帮助文档
# 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.
# 九九乘法表
# version 1.0
for row in range(1,10):
# 打印一行
for col in range(1,row+1):
# print函数默认任务打印完毕后换行
print(row * col, end=" ")
print("...................................")
#######################################
1 ...................................
2 4 ...................................
3 6 9 ...................................
4 8 12 16 ...................................
5 10 15 20 25 ...................................
6 12 18 24 30 36 ...................................
7 14 21 28 35 42 49 ...................................
8 16 24 32 40 48 56 64 ...................................
9 18 27 36 45 54 63 72 81 ...................................
# 定义一个函数,打印一行
def printLine(row):
for col in range(1,row+1):
# print函数默认任务打印完毕后换行
print(row * col, end="\t")
print("")
# 九九乘法表
# version 2.0
for row in range(1,10):
printLine(row)
#######################################
1
2 4
3 6 9
4 8 12 16
5 10 15 20 25
6 12 18 24 30 36
7 14 21 28 35 42 49
8 16 24 32 40 48 56 64
9 18 27 36 45 54 63 72 81
参数详解
- 参考资料
- python参考资料:headfrist python -> 零基础入门学习python(小甲鱼)-->习题-->后期可以考虑腾讯公开免费课
- 本讲义参考的是流畅的python
- 参数分类
- 普通参数
- 默认参数
- 关键字参数
- 收集参数
- 普通参数
参见上面实例
定义的时候直接定义变量名
-
调用的时候直接把变量名或者值放入指定位置
def 函数名 (参数1,参数2,...): 函数体 # 调用 函数名(value1, value2, ...) # 调用的时候,具体值参考的是位置,按位置赋值
- 默认参数
形参带有默认值
-
调用的时候,如果没有对相应的形参赋值,则使用默认值
def funcName(arg1=v1, arg2=v2, ...):
funcBlock# 调用1 funcName() # 调用2 v1 = 100 v2 = 200 funcName(v1, v2)
- 关键字参数
- 语法
def func(p1=v1, p2=v2, ....):
funcBlock
调用函数
func(p1=v1, p2=v2) - 比较麻烦,但也有好处
- 不同意混淆,一般实参和形参只是按照位置一一对应,容易出错
- 使用关键字参数,可以不考虑位置
- 语法
# 关键字
def stu(name, age, addr):
print("I am a student")
print("我叫{0},我今年{1}岁了,我住{2}".format(name, age, addr))
n = "jingjing"
a = 18
addr = "我家"
# 普通参数,只按照位置传递,容易出错
stu(a, n, addr)
def stuKey(name, age, addr):
print("I am a student")
print("我叫{0},我今年{1}岁了,我住{2}".format(name, age, addr))
n = "jingjing"
a = 18
addr = "我家"
# 普通参数,只按照位置传递,容易出错
stuKey(age=a, name=n, addr=addr)
############################################################################
I am a student
我叫18,我今年jingjing岁了,我住我家
I am a student
我叫jingjing,我今年18岁了,我住我家
收集参数-不定长参数
把没有位置,不能和定义是的参数位置相对应的参数,放入一个特定的数据结构中
-
语法
def func(*args):
funcBlock
按照list使用方式访问args得到的传入参数使用: func(p1,p2,p3,...)
参数名args不是必须这么写,但是,我们推荐使用args,约定俗成
参数名args前须要星号---*
收集参数可以和其他参数共存
# 收集参数
# 函数模拟一个学生进行自我介绍,但具体内容不清楚
# args把它看成一个list
def stu(*args):
print("------------------------------------------")
print("hello,大家好,我自我介绍下,简单说两句")
# type函数作用是检测变量的类型
print(type(args))
for item in args:
print(item)
stu("liuying", 18, "北京大通州区", "wangxiaojing", "single")
stu("周大神")
stu()
############################################################################
------------------------------------------
hello,大家好,我自我介绍下,简单说两句
liuying
18
北京大通州区
wangxiaojing
single
------------------------------------------
hello,大家好,我自我介绍下,简单说两句
周大神
------------------------------------------
hello,大家好,我自我介绍下,简单说两句
收集参数之关键字收集参数
把关键字参数按照字典格式存入收集参数
-
语法
def func(**kwargs):
funcBlock# 调用 func(p1=v1, p2-v2,...)
kwargs 约定俗成的写法
调用的时候,把多余的关键字参数放入kwargs中
访问kwargs需要按字典格式访问
# 关键字收集参数
# 自我介绍
# 调用的时候需要使用关键字调用
def stu(**kwargs):
print("*" * 50) # 字符串乘法
print(type(kwargs))
# 在函数体内对于kwargs的使用不用带星号
print("Hello,大家好,我先自我介绍一下:")
# 对于字典的访问,python2.x 跟python3.x有区别
for k,v in kwargs.items():
print(k,"---", v)
print(type(kwargs.items()))
stu(name="liuying", age=19, addr="北京大通州区", lover="王晓静", work="Teacher")
stu(name="周大神")
stu()
收集参数混合调用的顺序问题
- 收集参数,关键字参数,普通参数可以混合使用
- 使用规则就是,普通参数和关键字参数优先
- 定义的时候一般找普通参数,收集参数tuple,关键字参数,普通参数dict
# 收集参数混合使用
# stu模拟一个学生的自我介绍
def stu(name, age, *args, hobby="没有", **kwargs):
print("*" * 50)
print("Hello,大家好")
print("我叫{0}, 我今年{1}岁了".format(name, age))
if hobby == "没有":
print("我没有爱好,谢谢")
else:
print("我的爱好是{0}".format(hobby))
print("**********普通收集参数************************")
for i in args:
print(i)
print("**********关键字收集参数************************")
for k,v in kwargs.items():
print(k, "---", v)
# 开始调用
name = "liuying"
age = 19
# 调用不同格式
#stu(name, age)
#stu(name, age, "游泳")
stu(name, age, "王晓静", "刘石头", hobby="游泳", hobby2="烹饪", hobby3="跟不同女生聊天")
收集参数的解包问题
- 把参数放入list或者dict中,直接吧list、dict中的值放入手机参数中
- 语法:看代码
# 收集参数的解包问题
def stu(*args):
print("*" * 30)
print("hahaha")
# 主要用来调试
n = 0
for i in args:
print(type(i))
print(n)
n += 1
print(i)
stu("liuying", "liuxiaoying", 19, 200)
l = list()
l.append("liuying")
l.append("liuxiaoying")
l.append(19)
l.append(200)
# 这么写,会将list当成tuple的一个元素,所以for循环时只循环一次
stu(l)
# 如果要循环打印出list中的每一个元素,需要在实参前加上解包符号---*
stu(*l)
############################################################################
******************************
hahaha
0
liuying
1
liuxiaoying
2
19
3
200
******************************
hahaha
0
['liuying', 'liuxiaoying', 19, 200]
******************************
hahaha
0
liuying
1
liuxiaoying
2
19
3
200
同理 dict类型收集参数一样可以解包,但是
- 对dict类型进行解包
- 解包符---**
返回值
- 函数和过程的区别
- 有无返回值
- 需要用return返回
- 如果没有返回,则默认返回None
- 推荐写法,无论有无返回值,最后都要以return结束
函数文档
- 函数文档的作用是对当前函数提供使用相关参考信息
- 文档写法
- 在函数内部开始的第一行使用三引号字符串定义符
- 一般具体有特定格式
- 参看代码
- 文档查看
- 使用help函数查看
- 使用doc,查看代码
# 文档
# 函数stu是模拟一个学生的自我介绍的内容
def stu(name, age, *args):
'''
这是文档
第一行
第二行
第三行
'''
print("This is func doc")
# 查看函数文档
help(stu)
stu.__doc__
############################################################################
Help on function stu in module __main__:
stu(name, age, *args)
这是文档
第一行
第二行
第三行
Out[50]:
'\n 这是文档\n 第一行\n 第二行\n 第三行\n '
备注:以上内容均是观看北京图灵学院免费python视频课程摘抄的笔记