函数(function)是组织好的、可重复使用的、具有一定功能的代码段。函数能提高应用的模块性和代码的重复利用率,Python中已经提供了很多内建函数,比如print(),同时Python还允许用户自定义函数。

一、定义

定义函数使用关键字def,后接函数名和放在圆括号( )中的可选参数列表,函数内容以冒号起始并且缩进。一般格式如下:

def 函数名(参数列表):
"""文档字符串"""
函数体
return [expression]

注意:参数列表可选,文档字符串可选,return语句可选。

示例:

def fib(n):
"""Print a Fibonacci series"""
a, b = 0, 1
while b < n:
print(b, end=' ')
a, b = b, a+b
print() fib(2000) # call
f = fib # assignment
f(2000)

函数名的值是一种用户自定义的函数类型。函数名的值可以被赋予另一个名字,使其也能作为函数使用。

二、函数变量作用域

在函数内部定义的变量拥有一个局部作用域,在函数外定义的拥有全局作用域。注意:在函数内部可以引用全局变量,但无法对其赋值(除非用global进行声明)。

a = 5         # 全局变量a

def func1():
print('func1() print a =', a) def func2():
a = 21 # 局部变量a
print('func2() print a =', a) def func3():
global a
a = 10 # 修改全局变量a
print('func3() print a =', a) func1()
func2()
func3()
print('the global a =', a)

三、函数调用

1、普通调用

与其他语言中函数调用一样,Python中在调用函数时,需要给定和形参相同个数的实参并按顺序一一对应。

def fun(name, age, gender):
print('Name:',name,'Age:',age,'Gender:',gender,end=' ')
print() fun('Jack', 20, 'man') # call

2、使用关键字参数调用函数

函数也可以通过keyword=value 形式的关键字参数来调用,因为我们明确指出了对应关系,所以参数的顺序也就无关紧要了。

def fun(name, age, gender):
print('Name:',name,'Age:',age,'Gender:',gender,end=' ')
print() fun(gender='man', name='Jack', age=20) # using keyword arguments

3、调用具有默认实参的函数

Python中的函数也可以给一个或多个参数指定默认值,这样在调用时可以选择性地省略该参数:

def fun(a, b, c=5):
print(a+b+c) fun(1,2)
fun(1,2,3)

注意:通常情况下默认值只被计算一次,但如果默认值是一个可变对象时会有所不同, 如列表, 字典, 或大多类的对象时。例如,下面的函数在随后的调用中会累积参数值:

def fun(a, L=[]):
L.append(a)
print(L) fun(1) # 输出[1]
fun(2) # 输出[1, 2]
fun(3) # 输出[1, 2, 3]

4、调用可变参数函数

通过在形参前加一个星号(*)或两个星号(**)来指定函数可以接收任意数量的实参。

def fun(*args):
print(type(args))
print(args) fun(1,2,3,4,5,6) # 输出:
# <class 'tuple'>
# (1, 2, 3, 4, 5, 6)
def fun(**args):
print(type(args))
print(args) fun(a=1,b=2,c=3,d=4,e=5) # 输出:
# <class 'dict'>
# {'d': 4, 'e': 5, 'b': 2, 'c': 3, 'a': 1}

从两个示例的输出可以看出:当参数形如*args时,传递给函数的任意个实参会按位置被包装进一个元组(tuple);当参数形如**args时,传递给函数的任意个key=value实参会被包装进一个字典(dict)。

5、通过解包参数调用函数

上一点说到传递任意数量的实参时会将它们打包进一个元组或字典,当然有打包也就有解包(unpacking)。通过 单星号和双星号对List、Tuple和Dictionary进行解包:

def fun(a=1, b=2, c=3):
print(a+b+c) fun() # 正常调用
list1 = [11, 22, 33]
dict1 = {'a':40, 'b':50, 'c':60}
fun(*list1) # 解包列表
fun(**dict1) # 解包字典 # 输出:
# 6
# 66
# 150

注:*用于解包Sequence,**用于解包字典。解包字典会得到一系列的key=value,故本质上就是使用关键字参数调用函数。

四、lambda表达式

lambda关键词能创建小型匿名函数。lambda函数能接收任何数量的参数但只能返回一个表达式的值,它的一般形式如下:

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

lambda表达式可以在任何需要函数对象的地方使用,它们在语法上被限制为单一的表达式:

f = lambda x, y: x+y
print(f(10, 20))
def make_fun(n):
return lambda x: x+n f = make_fun(15)
print(f(5))

五、文档字符串

函式体的第一个语句可以是三引号括起来的字符串, 这个字符串就是函数的文档字符串,或称为docstring 。我们可以使用print(function.__doc__)输出文档:

def fun():
"""Some information of this function.
This is documentation string."""
return print(fun.__doc__)

文档字符串主要用于描述一些关于函数的信息,让用户交互地浏览和输出。建议养成在代码中添加文档字符串的好习惯。

个人站点:http://songlee24.github.com

Python3基础(五) 函数的更多相关文章

  1. Python3基础-特别函数(map filter partial reduces sorted)实例学习

    1. 装饰器 关于Python装饰器的讲解,网上一搜有很多资料,有些资料讲的很详细.因此,我不再详述,我会给出一些连接,帮助理解. 探究functools模块wraps装饰器的用途 案例1 impor ...

  2. javascript基础(五)函数

    原文http://pij.robinqu.me/ 通过call和apply间接调用函数(改变this) call 和 apply带有多个参数,call和apply把当前函数的this指向第一个参数给定 ...

  3. Python3基础 用 函数递归求解 一个数字的阶乘

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  4. python3基础(七)函数基础

    Function 函数是一段组织好的能够实现特定功能或者逻辑的代码块,函数代码在文件执行时读入内存并不执行,在调用函数时执行,简单来说是把一段代码封装给一个函数名(可以用变量的概念去理解,即把一段代码 ...

  5. JavaScript 基础(五) 函数 变量和作用域

    函数定义和调用 定义函数,在JavaScript中,定义函数的方式如下: function abs(x){ if(x >=0){ return x; }else{ return -x; } } ...

  6. Python3基础笔记--函数

    一.函数 定义: 函数是指将一组语句的集合通过一个名字(函数名)封装起来,要想执行这个函数,只需调用其函数名即可     特性: 1)代码重用 2)保持一致性 3)可扩展性 参考博客: Py西游攻关之 ...

  7. python3基础之“函数(2)”

    1.def:定义一个函数 def f(x): return x+1 #返回函数值 a=f(2) print(a) >>3 def even_odd(x): if x%2==0: " ...

  8. python3基础之“函数(1)”

    1.type:查看当前字符串的类型 c=' print(type(c),c) b= int(c) print(type(b),b) num=" a=int(num,base=16) prin ...

  9. Python3基础 def 函数要先定义再调用

             Python : 3.7.3          OS : Ubuntu 18.04.2 LTS         IDE : pycharm-community-2019.1.3    ...

  10. Python3基础 len函数 获得一个字符串的字符个数

    镇场诗:---大梦谁觉,水月中建博客.百千磨难,才知世事无常.---今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ ...

随机推荐

  1. 记一个java.lang.NoClassDefFoundError的问题

    如题,即找不到对应class,出现这个问题,很可能是文件路径配置错误,也可能是jar包丢失. 比如我今天遇到的问题,就是IDEA没有把mybatis的jar包复制到编译目录造成的.

  2. IFormattable,ICustomFormatter, IFormatProvider接口

    定                 义 1.IFormattable   提供一种功能,用以将对象的值格式化为字符串表示形式. 2.IFormatProvider  提供用于检索控制格式化的对象的机制 ...

  3. vue2.0之60s验证码发送

    快速的说下我的60s经历不管移动还是pc端的登录都需要发送验证信息,那么我们熟悉的那个验证按钮就不可少了.首先,我们都知道的一些基本功能.1.验证账号输入的格式正确与否(减少传递基本的错误信息)2.@ ...

  4. 联想 Z5 Pro(L78031)免解锁BL 免rec 保留数据 ROOT Magisk Xposed 救砖ZUI 10.0.355

    >>>重点介绍<<< 第一:本刷机包可卡刷可线刷,刷机包比较大的原因是采用同时兼容卡刷和线刷的格式,所以比较大第二:[卡刷方法]卡刷不要解压刷机包,直接传入手机后用 ...

  5. 【转】jvm内存结构

    JVM的基本结构 包括四部分:类加载器.执行引擎.内存区(运行时数据区).本地方法接口 类加载器:jvm启动时或类运行时将需要的class文件加载到JVM中. JVM内存申请过程如下: JVM 会试图 ...

  6. ecpilse将Web项目转变为Java工程

    转需: 用Eclipse开发项目的时候,把一个Web项目导入到Eclipse里会变成了一个Java工程,将无法在Tomcat中进行部署运行. 以下为将Java工程转变为Web项目的方法: 1.找到项目 ...

  7. ERwin逻辑模型

    1.自动排序 Format>>Preferences>>Layout Entire Diagram CA ERwin

  8. dutacm.club_1089_A Water Problem_(dp)

    题意:要获得刚好后n个'k'的字符串,有两种操作,1.花费x秒,增加或删除1个'k'; 2.花费y秒,使个数翻倍.问最少需要多少时间获得这个字符串. 思路:i为偶数个'k',dp[i]=min(dp[ ...

  9. day21-2 类的派生

    目录 类的派生 派生方法一 派生方法二 类的派生 派生:子类中新定义属性的这个过程叫做派生 派生方法一 指明道姓访问某一个类的函数:该方法与继承无关 class People: def __init_ ...

  10. jmeter的webservice接口测试(SOAP/XML-RPC Request)

    摘自:https://www.cnblogs.com/imyalost/p/5804359.html 项目背景:公司的微信端H5界面新开发了会员注册功能,需要对其进行压力测试 项目目标:需要承受每分钟 ...