函数

一、函数的定义

def是可执行的代码。def创建了一个对象并将其赋值给某一变量名。def语句是实时执行的,即:def在运行时才进行评估,而在def之中的代码在函数调用后才会评估。函数本身就是一个变量。

def (arg1,arg2,...):

...

return

匿名函数lambda:

它就是一个表达式,而不是一个语句,可以放在def不能用的地方。lambda的主体是一个单个的表达式,而不是一个代码块。

例如:

def func():

x = 4

action = (lambda n: x ** n)

return action

a = func()

print(a(2)) # 输出 16, 4**2

函数中重要的几点:

lambda创建一个对象但将其作为结果返回。

return将一个结果对象发送给调用者。

yield向调用者发回一个结果对象,但是记住它离开的地方。

global声明一个模块级的变量并被赋值。

nonlocal声明了将要赋值的一个封闭的函数变量。

函数是通过赋值(对象引用)传递的。

参数、返回值以及变量并不是声明。

函数的设计概念

耦合性:对于输入使用参数并且对于输出使用return语句。

耦合性:只有在真正必要的情况下使用全局变量。

耦合性:不要改变可变类型的参数,除非调用者希望这样做。

聚合性:每一个函数都应该有一个单一的、统一的目标。

大小:每一个函数应该相对较小。如果一个函数很长了,层级很多了,那就应该拆分了。

耦合:避免直接改变在另一个模块文件中的变量。

二、函数的参数问题

1.参数分类

(1). 位置参数

按位置一一对应传参;

例如:

func('wjz',22,'IT')

(2). 关键字参数

key/value形式传参;

例如:

func(name='wjz',age=22,job='IT')

(3). 默认参数

默认参数,形参位置不指定传参时,该参数的默认值;

例如:

def func(name,age,job='IT')

(4). 无命名不定长参数

*args 位置参数的组合;可以看做一个元组;调用函数时有两种方式:多个位置参数形式;*[list] 列表形式。

例如:加法器

def func(*args):

count=0

for i in args:

count+=i

print(count)

func(1,2,3,4,5) # 调用,里面数字可以任意多。

(5). 有命名不定长参数

**kwargs 关键字参数组合;可以看做一个字典;调用函数时有两种方式:多个关键字参数形式;**{key:value} 字典形式。

例如:

def func(**kwargs):

for i in kwargs:

print('%s: %s'%(i,kwargs[i]))

func(name='wjz',age=22,job='IT') # 调用,里面的key/value可以任意多。

2. 位置参数和关键字参数分隔符

用*间隔; *号之前的参数可以是位置参数或关键字参数;*之后的参数必须是关键字参数;当有*args和**kwargs时,不能使用*号。

例如:

def func(name,age,*,job):

print("name:%s" %name)

print("age:%d" %age)

print("job:%s" %job)

func('wjz',age=22,job='IT') # job='IT' 必须是关键字参数传参

3. 参数顺序

从左到右的顺序:

位置参数 ---> 关键字参数 ---> *args ---> 默认参数(我推荐放这里) ---> **kwargs

这里有个问题,默认参数和*args顺序的问题,我一直没分清真正的大牛是怎么使用的,下面是我实验的结果。我是推荐放在 *args后面

如果默认参数在前面,没有指定默认参数的实参时,会把*args的第一个参数给默认参数;并且如果有*args参数时,无法使用关键字参数指定默认参数。

如果默认参数在后面,调用函数指定默认参数时必须是关键字形式,并且必须在*args的后面。最好是避免默认参数和*args一起使用。官方网站给出的例子是默认参数放在了*args后面。如下:

另外,关键字参数不能写在位置参数前面。如果位置参数和关键字参数混合的,则关键则参数必须放在位置参数后面,且关键字参数不能有前面位置参数已经占位的参数。如:

def func(a,b,c,d):

print(a,b,c,d)

func(1,2,d=5,b=1) # 这个会报错:func() got multiple values for argument 'b'。因为位置参数已经把2赋值给了b;

func(1,2,d=5,c=1) # 这个正常,输出 1 2 1 5

三、函数的返回return

return的作用:让函数返回指定的值,便于我们对函数的正确执行与否做出判断,并且便于我们取函数执行的值。

函数在执行过程中,遇到return,则终止执行,并返回return指定的值;

当函数没有指定return时,默认返回 None;如果指定了return,则返回指定的对象。如果指定的是多个对象,解释器会把多个对象封装成一个元组;

四、函数的作用域

内嵌的模块是全局作用域;

全局作用域的作用范围仅限于单个文件;

每次对函数的调用都创建了一个新的本地作用域;

赋值的变量名除非声明为全局变量或非本地变量,否则均为本地变量;

所有其他的变量名都可以归纳为本地、全局或者内置的。

变量名解析遵循LEGB原则:

变量名引用分为三个作用域进行查找:首先是本地,之后是函数内,之后全局,最后是内置。

在默认情况下,变量名赋值会创建或者改变本地变量。

全局声明和非本地声明将赋值的变量名映射到模块文件内部的作用域。

LEGB原则:在3.0中,使用nonlocal解决作用域问题,应该叫LNGB原则。L即为local(函数中直接赋值的即默认为local);E即为Enclosing function locals(嵌套变量);G即为Global;B即为Built-in(内置变量);

例如:

x=10 # 全局变量global

def f():

t=5 # 嵌套变量 enclosing

def inner():

count=7 # 本地变量 local

return 1

global语句

global语句并不是一个类型或大小的声明,它是一个命名空间的声明。它告诉python函数生成一个或多个全局变量名。

全局变量名:

全局变量是位于模块文件内部的顶层的变量名;

全局变量如果是在函数内被赋值的话,必须经过声明;

全局变量名在函数的内部不经过声明也可以被引用;

nonlocal语句

nonlocal语句和global是近亲;它们两个一样,声明了将要在一个嵌套的作用域中修改的名称。和global不同的是,nonlocal应用于一个嵌套的函数的作用域中的一个名称,而不是所有def之外的全局模块作用域;而且在声明nonlocal名称的时候,它必须已经存在于该嵌套函数的作用域中。即nonlocal允许对嵌套的函数作用域中的名称赋值,并且把这样的名称的作用域查找限制在嵌套的def。

def func():

nonlocal name1,name2,...

例如:

def tester(start):

state = start

def nested(label):

print(label,state)

state +=1

return nested

F = tester(0)

F('spam') # 这时会报错:UnboundLocalError: local variable 'state' referenced before assignment

使用nonlocal进行修改:

def tester(start):

state = start

def nested(label):

nonlocal state

print(label,state)

state +=1

return nested

F = tester(0)

F('spam') # 输出 spam 0

F('jack') # 输出 jack 1

有几点需要注意:

当执行一条nonlocal语句时,nonlocal名称必须已经在一个嵌套的def作用域中赋值过。否则会报错:no binding for nonlocal 'state' found.即变量state必须在nonlocal声明之前赋值。赋值语句可以是nonlocal上一层的def。

nonlocal限制作用域查找仅为嵌套的def,nonlocal不会在嵌套的模块的全局作用域或所有def之外的内置作用域中查找。

python local函数_python中的函数相关推荐

  1. python round函数_python中round函数如何使用

    round函数很简单,对浮点数进行近似取值,保留几位小数.比如 >>> round(10.0/3, 2) 3.33 >>> round(20/7) 3 第一个参数是 ...

  2. python remove函数_python中remove函数的用法是什么?

    python中remove函数的用法是什么? python中remove函数的用法: 描述 remove() 函数用于移除列表中某个值的第一个匹配项. 语法 remove()方法语法: list.re ...

  3. python实现采样函数_python中resample函数实现重采样和降采样代码

    函数原型 resample(self, rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='s ...

  4. python中mat函数_Python中flatten( )函数及函数用法详解

    flatten()函数用法 flatten是numpy.ndarray.flatten的一个函数,即返回一个一维数组. flatten只能适用于numpy对象,即array或者mat,普通的list列 ...

  5. python中set函数_python中set()函数简介及实例解析

    set函数也是python内置函数的其中一个,属于比较基础的函数.其具体介绍和使用方法,下面进行介绍. set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集.差集.并 ...

  6. python查看dll中所有函数_Python中的函数

    初识函数 我们的程序的代码块很快变得越来越大,需要一些方法分成小代码块,便于组织,便于编写和阅读 程序分解成较小代码块有三种方法: 1.函数(function)实现具体功能的代码块,向代码的积木,可以 ...

  7. python中execute函数_python中的函数是如何使用的?

    欢迎关注「issnail」感谢! "一起学习,一起成长!" 1.定义函数与调用函数 定义python函数:依次输入def.函数名.带有函数参数的圆括号,最后紧跟一个冒号(:) 函数 ...

  8. python中什么叫函数_Python中的函数

    在其他编程语言中函数也叫方法,其实是一样的,只是叫法不同而已. 一.定义函数 defgreet_user():"""显示简单的问候语""" ...

  9. python中define函数_Python中的函数

    函数基础 01. 函数的快速体验 1.1 快速体验 所谓函数,就是把 具有独立功能的代码块组织为一个小模块,在需要的时候 调用 函数的使用包含两个步骤: 定义函数 -- 封装独立的功能 调用函数 -- ...

最新文章

  1. leetcode与python进阶学习总结
  2. Kitten编程猫 里的克隆体无法进行边缘检测
  3. 栈-线性表(代码、分析、汇编)
  4. Android官方开发文档Training系列课程中文版:手势处理之监测通用手势
  5. 斗地主AI算法——第四章の权值定义
  6. opengl笔记—— glMultMatrixf() 区别 glLoadMatrixf()
  7. 虚拟机实现java线程_深入理解java虚拟机(23):java与多线程
  8. IDEA利用wsdl文件生成WebService调用接口的方法
  9. C语言>>输入两个字符串,比较这两个字符串是否相同并输出比较结果。要求不用任何字符串处理函数。
  10. XSS 工具之 beef
  11. 世界最大的数字优惠券​公司
  12. SOCKET - 实现任意 HTTPS 站点代理, 支持篡改内容
  13. 【每日一趣】老王的烦恼
  14. 马云卸任后去蹦迪了?都是假的。
  15. Mac在终端直接使用root权限
  16. RoboMaster遥控器调参以及左上角拨轮开启教程
  17. ubuntu下PPPOE环境搭建
  18. 听说技术大佬们离不开这些App
  19. 大数据的作用是干什么
  20. group by 后面 order by 失效问题

热门文章

  1. 我研究了最热门的200种AI工具,却发现这个行业有点饱和
  2. 《Linux 命令行大全》. pdf 正式发布啦!
  3. “这辈子不可能打工男子”出狱了,引发热议!
  4. 单词搜索(二维字符网格中)
  5. 查看python解释器安装路径
  6. 安装tensorflow-gpu==1.13.1成功案例
  7. 数据类型:Struct 和 Union区别
  8. VUE.JS优势,初识。框架以及库的区别
  9. 常考题 | IoU 计算
  10. 【OpenCV 4开发详解】图像二值化