函数

函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段。

函数能提高应用的模块性,和代码的重复利用率。

1.定义函数

Python 定义函数使用 def 关键字,一般格式如下:

def 函数名(参数列表):函数体

简单的说明:

  • 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 ()。
  • 任何传入参数和自变量必须放在圆括号中间,圆括号之间可以用于定义参数。
  • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
  • 函数内容以冒号起始,并且缩进。
  • return [表达式] 结束函数,选择性地返回一个值给调用方。如果不写retuen表示没有任何返回。
    返回多个值:
    可以用return来返回多个值,这些值在返回的时候会自动包装成一个元组。在调用函数时也可以直接用多个变量来接收这些返回值。
    函数调用:
    定义一个函数:给了函数一个名称,指定了函数里包含的参数,和代码块结构。
    这个函数的基本结构完成以后,你可以通过另一个函数调用执行,也可以直接从 Python 命令提示符执行。

举栗子:

# 计算面积函数
def area(width, height):return width * heightdef print_welcome(name):print("Welcome", name)print_welcome("KKKK")
w = 4
h = 5
print("width =", w, " height =", h, " area =", area(w, h))

运行:

2.函数参数

1.位置参数

写一个计算x2的函数:

def power(x):return x * x

对于power(x)函数,参数x就是一个位置参数。当我们调用power函数时,必须传入有且仅有的一个参数x

def power(x, n):s = 1while n > 0:n = n - 1s = s * xreturn s

把上面的函数修改成一个计算n次方的函数,修改后的power(x, n)函数有两个参数:x和n,这两个参数都是位置参数,调用函数时,传入的两个值按照位置顺序依次赋给参数x和n。

2.默认参数

格式:参数名=默认值
调用函数时,我们不想输入那么多参数,这时我们再定义函数时设定默认参数。
如果没有传递参数给默认参数,则会使用默认参数的默认值。

def power(x, n=2):s = 1while n > 0:n = n - 1s = s * xreturn s

这样,当我们调用power(5)时,相当于调用power(5, 2),调用power(5,4)时,因为给默认参数传入了值,因此默认值2不会生效。这就是默认参数的作用了

3.可变参数

格式:*参数名字
顾名思义,可变参数就是传入的参数个数是可变的,可以是1个、2个到任意个,还可以是0个。
在函数内部,接收到的是一个元组,也就是说,通过可变参数传入的多个值是以元组存放的。
举栗子:

def printinfo( arg1, *vartuple ):"打印任何传入的参数"print ("输出: ")print (arg1)print (vartuple)# 调用printinfo 函数
printinfo( 70, 60, 50 )

运行:

如果已经有一个list或者tuple,要调用一个可变参数可以在list或者tuple变量名字前加一个*
举栗子:

def printinfo(arg1, *vartuple):"打印任何传入的参数"print("输出: ")print(arg1)print(vartuple)tuple = (60,50,40)
# 调用printinfo 函数
printinfo(70,*tuple)

运行:

4.关键字参数

格式:**参数名字
可变参数允许你传入0个或任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)person('ttt',22)

函数person除了必选的参数name和age外,还有关键字参数kw。在调用该函数时,可以只传入必选参数:

也可以传入任意个数的关键字参数:

和可变参数类似,也可以将已经存在的dict通过关键字参数将键值对传进函数,方法是在调用时在字典变量名字前面加两个*

def person(name, age, **kw):print('name:', name, 'age:', age, 'other:', kw)dict1 = {'city': 'Beijing', 'job': 'Engineer'}
person('ttt',22,**dict1)

运行:

关键字参数作用:
扩展函数的功能。比如,在person函数里,我们保证能接收到name和age这两个参数,但是,如果调用者愿意提供更多的参数,我们也能收到。试想你正在做一个用户注册的功能,除了用户名和年龄是必填项外,其他都是可选项,利用关键字参数来定义这个函数就能满足注册的需求。

命名关键字参数
对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查。
仍以person()函数为例,我们希望检查是否有city和job参数:

def person(name, age, **kw):if 'city' in kw:# 有city参数passif 'job' in kw:# 有job参数passprint('name:', name, 'age:', age, 'other:', kw)

但是调用者仍可以传入不受限制的关键字参数:

person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)

如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:

def person(name, age, *, city, job):print(name, age, city, job)

和关键字参数*kw不同,命名关键字参数需要一个特殊分隔符,*后面的参数被视为命名关键字参数。
调用方式如下:

 person('Jack', 24, city='Beijing', job='Engineer')

如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def person(name, age, *args, city, job):print(name, age, args, city, job)

命名关键字参数必须传入参数名,这和位置参数不同。如果没有传入参数名,调用将报错。

命名关键字参数可以有缺省值,从而简化调用:

def person(name, age, *, city='Beijing', job):print(name, age, city, job)

由于命名关键字参数city具有默认值,调用时,可不传入city参数:

person('Jack', 24, job='Engineer')

使用命名关键字参数时,要特别注意,如果没有可变参数,就必须加一个作为特殊分隔符。如果缺少,Python解释器将无法识别位置参数和命名关键字参数:

def person(name, age, city, job):# 缺少 *,city和job被视为位置参数pass

3.组合参数

在Python中定义函数,可以用位置参数、默认参数、可变参数、关键字参数(命名关键字参数),这些参数都可以组合使用。但是,参数定义的顺序必须是:位置参数、默认参数、可变参数、关键字参数(命名关键字参数)。

def f1(a, b, c=0, *args, **kw):print('a =', a, 'b =', b, 'c =', c, 'args =', args, 'kw =', kw)def f2(a, b, c=0, *, d, **kw):print('a =', a, 'b =', b, 'c =', c, 'd =', d, 'kw =', kw)f1(1, 2)
f1(1, 2, c=3)
f1(1, 2, 3, 'a', 'b')
f1(1, 2, 3, 'a', 'b', x=99)
f2(1, 2, d=99, ext=None)

运行:

4.匿名函数

python 使用 lambda 来创建匿名函数。
所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。

  • lambda 只是一个表达式,函数体比 def 简单很多。
  • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。
  • lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
  • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率。
    语法
    lambda 函数的语法只包含一个语句,如下:

    lambda [arg1 [,arg2,.....argn]]:expression

    举个例子:

    # 可写函数说明
    sum = lambda arg1, arg2: arg1 + arg2
    # 调用sum函数
    print ("相加后的值为 : ", sum( 10, 20 ))
    print ("相加后的值为 : ", sum( 20, 20 ))

    运行:

    相加后的值为 :  30
    相加后的值为 :  40

5.全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。
局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。如下实例:

total = 0 # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):#返回2个参数的和."total = arg1 + arg2 # total在这里是局部变量.print ("函数内是局部变量 : ", total)return total#调用sum函数
sum( 10, 20 )
print ("函数外是全局变量 : ", total)

以上实例输出结果:

函数内是局部变量 :  30
函数外是全局变量 :  0

global 关键字
将变量声明为全局变量。
小栗子:

num = 1
def fun1():num = 123print(num)
fun1()
print(num)

实例输出结果:

123
1

以下实例修改全局变量 num:

num = 1
def fun1():global num  #使用 global 关键字声明 num 为全局变量print(num)  #现在num已经是全局变量了num = 123   #改变全局变量num的值print(num)
fun1()
print(num)

以上实例输出结果:

1
123
123

转载于:https://blog.51cto.com/13885935/2161686

Python学习—函数相关推荐

  1. python学习——函数及其参数

    函数 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段.函数能提高应用的模块性,和代码的重复利用率.严格来说python只有函数,没有过程,人们理解的函数都是带有return的,而过程 ...

  2. python学习--函数例子

    1 #!/usr/bin/env python3 2 # -*- coding:utf-8 -*- 3 4 #01 函数的定义,调用 5 #生日歌 6 def happy(): 7 print(&qu ...

  3. Debian Linux下的Python学习——函数

    python函数通过def关键字定义.def关键字后跟一个函数的标识符名称,然后跟一对圆括号.圆括号之中可以包括一些变量名,该行以冒号结尾.接下来是一块语句,它们是函数体. 1.无参数函数(函数不带参 ...

  4. python学习-函数(定义、可变参、小练习(列表最小值函数))

    函数目录 定义 可变参函数 自定义列表最小值函数 定义 函数定义使用关键字def,可以不带参数,也可以带参数,带参数的函数,可以使用位置参数,详见示例: str1 = 'sadf'def printV ...

  5. python学习——函数

    函数 内建函数,如print() 用户自定义函数 一.函数定义法则 函数代码块以 def 关键词开头,后接函数标识符名称和圆括号 (). def 函数名(参数列表): 函数体 函数内容以冒号 : 起始 ...

  6. 小猿圈python学习-函数的递归

    求100不断除以2直到商为0为止,打印每次除的商 用循环实现 n = 100 while n > 0: n = int(n/2) print(n) 输出: 50 25 12 6 3 1 0 如果 ...

  7. Python学习 - 面向对象之多态

    Python学习 - 语法入门:https://blog.csdn.net/wanzijy/article/details/125287855 Python学习 - 数据类型:https://blog ...

  8. python eval 入门_Python学习笔记整理3之输入输出、python eval函数

    Python学习笔记整理3之输入输出.python eval函数 来源:中文源码网    浏览: 次    日期:2018年9月2日 Python学习笔记整理3之输入输出.python eval函数 ...

  9. 整理了7道Python函数的练习题,希望对你学习函数有帮助

    1.简述普通参数,指定参数,默认参数,动态参数的区别 普通参数:以正确的顺序传入函数,调用时数量必须和声明的一样 指定参数:参数和函数调用关系密切,函数调用使用关键字参数来确定传入的参数值,参数 允许 ...

最新文章

  1. nvidia旧版驱动_N卡用户注意:老版驱动存在5个高危漏洞,赶紧更新
  2. linux防火墙伦堂,「linux专栏」自从看了这篇文章,我彻底搞懂了selinux和防火墙...
  3. python的__new__方法和__del__方法
  4. XMLHTTP使用具体解释
  5. 使用ffmpeg循环推流(循环读取视频文件)推送RTMP服务器的方法
  6. 使用javaMail收邮件 支持附件下载
  7. 3 计算机组成原理第三章 存储系统 主存简单模型及寻址 半导体寄存器 存储器分类 主存与CPU连接 双口RAM和多模块寄存器
  8. php 面相对象设计,PHP面向对象设计的规范
  9. java ajax无权限跳转_如何在ajax权限判断后跳转?
  10. python爬silverlight_Python创建Silverlight控件编写过程经验分享
  11. 燕山大学计算机学院官网,燕山大学信息科学与工程学院(专业学位)计算机技术保研夏令营...
  12. git reset --mixed, - soft和--hard有什么区别?
  13. Kubernetes 小白学习笔记(24)--kubernetes的运维-管理Service
  14. dsoframer.ocx java_dsoframer.ocx(java web 操作word) 总结一下
  15. js 获取当天23点59分59秒 时间戳
  16. 史上最全 Vue 前端代码风格指南
  17. 音视频基础 、IPB帧及其特点
  18. wamp5工具安装介绍
  19. 看看你去苹果公司的话能挣多少钱
  20. js处理移动端有虚拟按键影响页面布局的处理方法

热门文章

  1. 零基础python入门编程全栈量化ai 百度云_Python编程量化AI全栈零基础入门帖子详情 - 网易云课堂...
  2. 声音匹配_如何调节人声音色方法如下
  3. api文档数据量太大崩溃_比较最好的免费金融市场数据API
  4. java gson 解析string_Java之——深入解析String、StringBuffer、StringBuiler
  5. 固态器件理论(10)半导体制造技术
  6. column命令+pagesize命令+linesize命令+ttitle命令+btitle命令+break命令/comput命令
  7. 分析USB平台设备模型框架(1)
  8. 50个查询系列-第二个查询
  9. 挑战蓝牙/Wi-Fi NFA争食无线音频应用大饼(转)
  10. [Android疑难杂症]动态改变Background后Padding无效的问题