函数

  • 代码的一种组织形式
  • 一个函数一般完成一项特定的功能
  • 函数使用
    • 函数需要先定义
    • 使用函数,俗称调用
# 定义一个函数
# 只是定义的话不会执行
# 1. def关键字,后跟一个空格
# 2. 函数名,自己定义,起名需要遵循便令命名规则,约定俗成,大驼峰命名只给类用
# 3. 后面括号和冒号不能省,括号内可以由参数
# 4. 函数内所有代码缩进def func():print("这句话属于函数")print("这句话也属于函数")return Noneprint("这句话不属于函数")
这句话不属于函数
# 函数的调用
# 直接函数名后面跟括号
func()
这句话属于函数
这句话也属于函数

函数的返回值

  • 返回值: 函数的执行结果

    • 使用return关键字返回结果
    • 如果没有return,默认返回一个None
    • 没有值需要返回时,推荐使用return None表示函数介绍
    • 函数一旦执行return语句,则无条件返回,即结束函数的执行
# 返回值示例def func_1():print("有返回值呀")return 1def func_2():print("没有返回值")f1 = func_1()
print(f1)f2 = func_2()
print(f2)
有返回值呀
1
没有返回值
None
# 参数的定义和使用
# 参数person只是一个符号,代表的是调用的时候的某一个数据
# 调用的时候,会用p的值代替函数中所有的persondef hello(person):print("Hello {0}!".format(person))hello("world")def hello(person):print("Hello {0}!".format(person))return Nonehello("world")
Hello world!
Hello world!
# return语句的基本使用
# 函数打完招呼后返回一句话
def hello(person):print("{0},你终于上线了".format(person))print("{0},一起来打桌球吗".format(person))return "我邀请{0}打桌球,{0}不理我".format(person)inputPerson = "马露源"returnStr = hello(inputPerson)print(returnStr)
马露源,你终于上线了
马露源,一起来打桌球吗
我邀请马露源打桌球,马露源不理我
# return案例2def hello(person):print("{0},这是打印出来的第一句话".format(person))return "{0},这是返回的第一句话".format(person)print("猜猜这段话会不会被打印?")return "报告{0},这句话并不会被返回".format(person)inputPerson = "Maluyuan"
returnStr = hello(inputPerson)
print(returnStr)
Maluyuan,这是打印出来的第一句话
Maluyuan,这是返回的第一句话
# 查找函数帮助文档
# 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
print("%4s"%(" "),end="")
for i in range(1, 10):print("%4d"%(i),end="")
print("")for row in range(1, 10):print("%4d"%(row),end = "")for col in range(1, row+1):print("%4d"%(row*col),end = "")print("%4s"%("--")* ( 9-row ))
       1   2   3   4   5   6   7   8   91   1  --  --  --  --  --  --  --  --2   2   4  --  --  --  --  --  --  --3   3   6   9  --  --  --  --  --  --4   4   8  12  16  --  --  --  --  --5   5  10  15  20  25  --  --  --  --6   6  12  18  24  30  36  --  --  --7   7  14  21  28  35  42  49  --  --8   8  16  24  32  40  48  56  64  --9   9  18  27  36  45  54  63  72  81
# 九九乘法表
# version 2.0def printTable(inputRow):print("%3s"%(" "), end="")for i in range(1, inputRow+1):print("%4d"%i, end="")print("")for row in range(1, inputRow+1):print(row, end="  ")for col in range (1, row+1):print("%4d"%(row*col), end="")print("%4s"%"--" * (inputRow-row) )return NoneprintTable(9)
      1   2   3   4   5   6   7   8   9
1     1  --  --  --  --  --  --  --  --
2     2   4  --  --  --  --  --  --  --
3     3   6   9  --  --  --  --  --  --
4     4   8  12  16  --  --  --  --  --
5     5  10  15  20  25  --  --  --  --
6     6  12  18  24  30  36  --  --  --
7     7  14  21  28  35  42  49  --  --
8     8  16  24  32  40  48  56  64  --
9     9  18  27  36  45  54  63  72  81
# 九九乘法表
# version 3.0def printTable(inputRow):print("{:3s}".format(" "), end="")for i in range(1, inputRow+1):print("{:4d}".format(i), end="")print("")for row in range(1, inputRow+1):print(row, end="  ")for col in range (1, row+1):print("{:4d}".format(row*col), end="")print("%4s"%("--") * (inputRow-row) )return NoneprintTable(9)
      1   2   3   4   5   6   7   8   9
1     1  --  --  --  --  --  --  --  --
2     2   4  --  --  --  --  --  --  --
3     3   6   9  --  --  --  --  --  --
4     4   8  12  16  --  --  --  --  --
5     5  10  15  20  25  --  --  --  --
6     6  12  18  24  30  36  --  --  --
7     7  14  21  28  35  42  49  --  --
8     8  16  24  32  40  48  56  64  --
9     9  18  27  36  45  54  63  72  81

函数的参数

  • 参数: 负责给函数传递一些必要的数据或者信息

    • 形参(形式参数): 在函数定义的时候用到的参数没有具体值,只是一个占位的符号,成为形参
    • 实参(实际参数): 在调用函数的时候输入的值

参数分类

- 普通参数
- 默认参数
- 关键字参数
- 收集参数

普通参数

- 定义的时候直接定义变量名
- 调用的时候直接把变量或者值放入指定位置def 函数名(参数1, 参数2,....):函数体return None# 调用函数名(value1, value2,.......)# 调用的时候,具体值参考的是位置,按位置赋值

默认参数

- 形参带有默认值
- 调用的时候,如果没有对相应形参赋值,则使用默认值def  func_name(p1=v1, p2=v2..........):func_block#调用1func_name()# 调用2value1= 100value2=200func_name(value1,value2)
  • 参考资料
  • python参考资料: headfirst python -> 零基础入门学习python(小甲鱼),本讲义参考的是流畅的python–>习题–>后期可以考虑腾讯公开免费课
# 默认参数示例
# 报名函数,需要知道学生性别
# 学习python的学生基本都是男生,所以,报名的时候如果没有特别指定,我们任务是男生
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))return None# 调用默认参数函数案例
reg("LiangYueHan", 22)reg("MaLuYuan", 22, "female")
LiangYueHan is 22, and he is a good student
MaLuYuan is 22, and she is a good student

关键字参数

  • 语法

      def func(p1=v1, p2=v2.....):func_body调用函数:func(p1=value1, p2=value2.......)
    
  • 比较麻烦,但也有好处:

    • 不容易混淆, 一般实参和形参只是按照位置一一对应即可,容易出错
    • 使用关键字参数,可以不考虑参数位置
# 关键字参数案例
# 普通参数,只按照位置传递,容易出错
def stu(name, age, addr):print("I am a student")print("我叫 {0}, 我今年 {1}岁了, 我住{2}".format(name, age, addr))n = "LiangYueHan"
a = 22
addr = "NanHu"stu(a, n, addr)
I am a student
我叫 22, 我今年 LiangYueHan岁了, 我住NanHu
# 关键字参数案例
def stu_key(name="NULL", age=0, addr="NULL"):print("I am a student")print("我叫 {0}, 我今年 {1}岁了, 我住{2}".format(name, age, addr))n = "LiangYueHan"
a = 22
addr = "NanHu"stu_key()
stu_key(age=a, name=n, addr=addr)
I am a student
我叫 NULL, 我今年 0岁了, 我住NULL
I am a student
我叫 LiangYueHan, 我今年 22岁了, 我住NanHu

收集参数

  • 把没有位置,不能和定义时的参数位置相对应的参数,放入一个特定的数据结构中

  • 语法

      def func(*args):func_body按照list使用方式访问args得到传入的参数调用:func(p1, p2, p3, .....)
    
  • 参数名args不是必须这么写,但是,我们推荐直接用args,约定俗成

  • 参数名args前需要由星号

  • 收集参数可以和其他参数共存

# 收集参数代码
# 函数模拟一个学生进行自我介绍,但具体内容不清楚
# args把他看做一个list
def stu( *args):print("Hello 大家好,我自我介绍以下,简答说两句:")# type函数作用是检测变量的类型print(type(args))for item in args:print(item)return Nonestu("liangyuehan", 22, "徐州", "maluyuan", "rouwanzi")
Hello 大家好,我自我介绍以下,简答说两句:
<class 'tuple'>
liangyuehan
22
徐州
maluyuan
rouwanzi
stu("Albert")
Hello 大家好,我自我介绍以下,简答说两句:
<class 'tuple'>
Albert
# 收集参数可以不带任何实参调用,此时收集参数为空tuple
stu()
Hello 大家好,我自我介绍以下,简答说两句:
<class 'tuple'>
# 如果使用关键字参数格式调用,会出现问题
stu(name="liangyuehan")
---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)<ipython-input-58-ed6e04db5cfa> in <module>()1 # 如果使用关键字参数格式调用,会出现问题
----> 2 stu(name="liangyuehan")TypeError: stu() got an unexpected keyword argument 'name'

收集参数之关键字收集参数

  • 把关键字参数按字典格式存入收集参数

  • 语法:

      def func( **kwargs):func_body# 调用:func(p1=v1, p2=v2, p3=v3........)
    
  • kwargs一般约定俗成,不是必须,(keyword)

  • 调用的时候,把多余的关键字参数放入kwargs

  • 访问kwargs需要按字典格式访问

# 收集参数案例
# 调用的时候需要使用关键字参数调用
# 函数体内的kwargs不带星号
def stu( **kwargs):print("Hello 大家好,我先自我介绍一下:")print(type(kwargs))# 对于字典的访问,python2 和python3有区别for k,v in kwargs.items():print(k, ":", v)
stu(name="liangyuehan",  age=22, addr="徐州", lover="梁越瀚", work="Student")
Hello 大家好,我先自我介绍一下:
<class 'dict'>
name : liangyuehan
age : 22
addr : 徐州
lover : 梁越瀚
work : Student
stu(name="Albert")
简单介绍一下我自己:
<class 'dict'>
name : Albert
# 关键字收集参数为空
stu()
简单介绍一下我自己:
<class 'dict'>
#错误用法
stu("Liangyuehan")
---------------------------------------------------------------------------TypeError                                 Traceback (most recent call last)<ipython-input-75-addf489c1c6c> in <module>()1 #错误用法
----> 2 stu("Liangyuehan")TypeError: stu() takes 0 positional arguments but 1 was given

收集参数混合调用的顺序问题

  • 收集参数,关键字参数,普通参数可以混合使用
  • 使用规则就是,普通参数和关键字参数优先
  • 定义的时候一般找普通参数,关键字参数,收集参数tuple,收集参数dict
# 收集参数混合调用案例
# stu模拟一个学生的自我介绍
def stu(name, age, *args, hobby="没有", **kwargs):print("Hello 大家好")
#普通参数print("我叫 {0}, 我今年{1}大了。".format(name, age))
#默认参数if hobby == "没有":print("我没有爱好, so sorry")else:print("我的爱好是{}".format(hobby))
#收集参数        print("*" * 20, "以下内容为收集参数")      for i in args:print(i)#关键字收集参数    print("#" * 30, "以下内容为关键字收集参数")for k,v in kwargs.items():print(k, "---", v)
# 开始调用函数
name = "LiangYueHan"
age = 19
stu(name, age)
Hello 大家好
我叫 LiangYueHan, 我今年19大了。
我没有爱好, so sorry
******************** 以下内容为收集参数
############################## 以下内容为关键字收集参数
stu(name, age, hobby="游泳")
Hello 大家好
我叫 LiangYueHan, 我今年19大了。
我的爱好是游泳
******************** 以下内容为收集参数
############################## 以下内容为关键字收集参数
stu(name, age, "马露源", "Albert", hobby="吃饭", hobby2="烹饪", hobby3="睡觉")
Hello 大家好
我叫 LiangYueHan, 我今年19大了。
我的爱好是吃饭
******************** 以下内容为收集参数
马露源
Albert
############################## 以下内容为关键字收集参数
hobby2 --- 烹饪
hobby3 --- 睡觉

收集参数的解包问题

  • 把参数放入list或者字典中,直接把list/dict中的值放入收集参数中
  • 语法:参看案例
# 收集参数的解包问题def stu(*args):print(type(args))n = 1for items in args:print("元素{}-----------".format(n))print(type(items))print(items)n += 1#调用方式1
stu("liuying", "liuxiaoyhing", 19, 200)
<class 'tuple'>
元素1-----------
<class 'str'>
liuying
元素2-----------
<class 'str'>
liuxiaoyhing
元素3-----------
<class 'int'>
19
元素4-----------
<class 'int'>
200
list = ["liangyuehan", 19, 23, "maluyuan"] stu(list)
# 此时,args的表示形式是字典内一个list类型的元素,即 arg = (["liuying", 19, 23, "wangxiaojing"],)
# 很显然跟我们最初的想法违背print("--"*50)# 此时的调用,我们就需要解包符号,即调用的时候前面加一个星号
stu(*list)
<class 'tuple'>
元素1-----------
<class 'list'>
['liangyuehan', 19, 23, 'maluyuan']
----------------------------------------------------------------------------------------------------
<class 'tuple'>
元素1-----------
<class 'str'>
liangyuehan
元素2-----------
<class 'int'>
19
元素3-----------
<class 'int'>
23
元素4-----------
<class 'str'>
maluyuan

同理,dict类型收集参数一样可以解包,但是

  • 对dict类型进行解包
  • 需要用两个星号进行解包
def stu1(**kwargs):print((kwargs))print(type(kwargs))for k,v in kwargs.items():print(k, ":", v)return Nonedictionary = {"name" : "LiangYueHan", "age" : "22", "addr" : "NanHu-L-A4141"}
stu1(**dictionary)
{'name': 'LiangYueHan', 'age': '22', 'addr': 'NanHu-L-A4141'}
<class 'dict'>
name : LiangYueHan
age : 22
addr : NanHu-L-A4141

函数文档

  • 函数的文档的作用是对当前函数提供使用相关的参考信息
  • 文档的写法:
    • 在函数内部开始的第一行使用三引号字符串定义符
    • 一般具有特定格式
    • 参看案例
  • 文档查看
    • 使用help函数,形如 help(func)
    • 使用__doc__, 参看案例
# 文档案例
# 函数stu是模拟一个学生的自我介绍的内容
def stu(name, age, *args):'''这是第一行这是第二行这是第三行'''print("This is Function stu")
# 查看函数文档
help(stu)print("--"*50)stu.__doc__
Help on function stu in module __main__:stu(name, age, *args)这是第一行这是第二行这是第三行----------------------------------------------------------------------------------------------------'\n    这是第一行\n    这是第二行\n    这是第三行\n    '

def stu(name, age):'''文档说明:param name: 表示学生的姓名:param age: 表示学生的年龄:return: 此函数没有返回值'''passprint(help(stu))print("*" * 20)print(stu.__doc__)
Help on function stu in module __main__:stu(name, age)文档说明:param name: 表示学生的姓名:param age: 表示学生的年龄:return: 此函数没有返回值None
********************文档说明:param name: 表示学生的姓名:param age: 表示学生的年龄:return: 此函数没有返回值

python笔记06: 函数相关推荐

  1. python 笔记:函数

    1 空函数 如果想定义一个啥都不做的空函数,可以用pass语句 因为python没有:,所以if语句如果没有内容的话,用pass语句 2 函数的返回值 函数可以返回多个值(相当于返回一个tuple-- ...

  2. 笨方法“学习python笔记之函数

    规则 python也支持函数功能,但是定义了一些简单规则 函数代码以def关键词开头,后接函数标识符名称 和圆括号(). 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数 函数的第一 ...

  3. 初学者python笔记(函数)

    文章目录 1. python中的函数参数 2. 一个能接收任意值的函数 3. 函数递归 4. 函数作用域 5. 函数嵌套 函数嵌套的调用(1) 函数嵌套的调用(2) 函数嵌套的调用(3) 函数可以说是 ...

  4. PYTHON 笔记:函数的定义和调用

    函数定义: def 函数名([参数表]): "文档字符串"函数体 函数体需要缩进 例:打印字符串 def printStr(x)'''print the string'''prin ...

  5. 轩小陌的Python笔记-day11 函数进阶

    day11 函数进阶 目标:掌握函数相关易错点 & 项目开发必备技能. 今日概要: 参数的补充 函数名到底是什么? 返回值和print,傻傻分不清楚. 函数的作用域 1.参数的补充 在函数基础 ...

  6. python笔记22-literal_eval函数处理返回json中的单双引号

    前言 在做接口测试的时候,最常见的接口返回数据就是json类型,json类型数据实际上就是字串,通常标准的json格式是可以转化成python里面的对应的数据类型的 有时候开发返回的数据比较坑,不按常 ...

  7. python 笔记 之 函数中默认参数的影响

    2019独角兽企业重金招聘Python工程师标准>>> # 声明一个函数,第一个参数是整型,第二个参数是list类型, # l 有一个默认值,默认值为[]空列表def f(x,l=[ ...

  8. PYTHON 笔记:函数的参数(关键字参数,默认参数,可变长参数,可变长的关键字参数)

    一般的函数参数是位置参数,位置不对会出问题 1.关键字参数 使用参数名提供的参数就是关键字参数,有了关键字参数,顺序就不会有影响. >>>def printGrade(name,ID ...

  9. python笔记2 - 函数,表达式,语句

    1.python诞生 创始人:Guido van Rossum(荷兰人) 时间:1989年圣诞节 地点:阿姆斯特丹 应用领域:     系统运维     网络编程(搜索引擎,爬虫,服务器编程等)   ...

最新文章

  1. atoi实现(考虑足够多种的情况)c++
  2. 那些年,使用Github的正确姿势
  3. linux ps top 命令 VSZ,RSS,TTY,STAT, VIRT,RES,SHR,DATA的含义
  4. linux 安装x环境,linux下安装xdebug
  5. 二维有限体积 matlab,二维有限体积法计算热传导及源码.pdf
  6. Linux部署Apache ActiveMQ 5.14.1
  7. 2014牡丹江网络赛ZOJPretty Poem(暴力枚举)
  8. linux命令提示符不同,Linux命令提示符如何按照自己的习惯修改?
  9. jeecg-framework-3.3.2-RELEASE 最新版本发布
  10. 读《C++ Primer(第三版)》的一些疑问(不断更新)
  11. python编程实现撤销上一步操作_78行Python代码实现现微信撤回消息功能
  12. Android Canvas类介绍和Android Draw Rect 坐标图示
  13. python可视化的图表汉字显示成框框_Matplotlib图表上输出中文(汉字)、减号问题...
  14. 导弹拦截(NOIP2010 普及组第三题)
  15. 照着官网来安装openstack pike之glance安装
  16. 超像素分割算法研究:SLIC分割算法原理讲解
  17. 【GMSK+FPGA】基于verilog的GMSK调制系统设计
  18. 计算机启动检测不到硬盘,电脑BIOS启动项找不到硬盘,该怎么办?
  19. PostgreSQL 数据加密之 pgcrypto
  20. gcc常用命令与gcc编译器背后的故事

热门文章

  1. 1035 插入与归并(C++)
  2. 使用pandas时间窗口函数rolling完成量化交易之移动平均线
  3. ssh authentication魔鬼细节--.ssh文件夹权限
  4. 美国在线黄页服务提供商YP控股拟竞购雅虎网络资产
  5. php 获取微信文章阅读量,获取微信公众号的文章的阅读数的实践(请求参数不支持文章 ID)...
  6. ZT 安卓手机的安全性 prepare for Q
  7. linux 安装wkhtmltopdf 所出的问题
  8. Qt编写可视化大屏电子看板系统27-模块5负荷分布
  9. 信号与系统、数字信号处理、滤波、傅里叶变换、数字信号模拟信号采样信号、滤波器零阶保持器
  10. 知乎百万热议:程序员如何做到年薪 50 万?