函数定义与调用
函数定义语法
def 函数名([参数列表]):
‘‘‘注释‘‘‘
函数体
- 函数形参不需要声明类型,也不需要指定函数返回值类型
- 即使该函数不需要接收任何参数,也必须保留一对空的圆括号
- 括号后面的冒号必不可少
- 函数体相对于def关键字必须保持一定的空格缩进
- Python允许嵌套定义函数
- 不需要声明函数的返回值类型,而是使用return语句。
- 函数是可调用对象。
修饰器
- 修饰器本质上也是一个函数,只不过这个函数接收其他函数作为参数并对其进行一定的改造之后使用新函数替换原来的函数。
- Python面向对象程序设计中的静态方法、类方法、属性等也都是通过修饰器实现的。
函数参数
- 定义函数时不需要声明参数类型,解释器会根据实参的类型自动推断形参类型。
- 绝大多数情况下,在函数内部直接修改形参的值不会影响实参,而是创建一个新变量。
- 如果传递给函数的实参是可变序列,并在函数内部使用下标或可变序列自身的方法时,实参也得到相应的修改。
位置参数
- 调用函数时实参和形 参的顺序必须严格一致,并且实参和形参的数量必须相同。
默认值参数
def 函数名(……,形参名=默认值):
函数体
- 需要注意的是,在定义带有默认值参数的函数时,任何一个默认值参数右边 都不能再出现没有默认值的普通位置参数,否则会提示语法错误。
- 一般避免使用可变序列作为函数参数默认值,可能会产生逻辑错误。
- 函数的默认值参数是在函数定义时确定值的,所以只会被初始化一次。
关键参数
- 可以按参数名字传递值,明确指定哪个值传递给哪个参数,实参顺序可以和形参顺序不一致。
可变长度参数
可变长度参数主要有两种形式:在参数名前加1个*或2个**
- *parameter用来接受多个位置参数并将其放在一个元组中
- **parameter接受多个关键参数并存放到字典中
传递参数时的序列解包
- 传递参数时,可以通过在实参序列前加一个星号将其解包,然后传递给多个单变量形参。
- 调用函数时对实参序列使用一个星号进行解包后的实参将会被当做普通位置参数对待,并且会在关键参数和使用两个星号进行序列解包的参数之前进行处理。
变量作用域
- 函数执行结束后,局部变量自动删除。
- 全局变量可以通过关键字global来定义。这分为两种情况:
- 一个变量已在函数外定义,如果在函数内需要为这个变量赋值,并要将这个赋值结果反映 到函数外,可以在函数内使用global将其声明为全局变量。
- 如果一个变量在函数外没有定义,在函数内部也可以直接将一个变量定义为全局变量,该函数执行后,将增加一个新的全局变量。
- 在函数内只引用某个变量的值而没有为其赋新值,那么该变量为全局变量。
- 在函数内任意位置有为变量赋新值的操作,该变量既被认为是局部变量,除非在函数内用global声明。
- 如果局部变量和全局变量同名,那么该局部变量会在自己的作用域内隐藏同名的局部变量。
lambda表达式
- lambda表达式可以用来声明匿名函数,也就是没有函数名字的临时使用的小 函数,尤其适合需要一个函数作为另一个函数参数的场合。也可以定义具名函数。
- lambda表达式只可以包含一个表达式,该表达式的计算结果可以看作是函数 的返回值,不允许包含复合语句,但在表达式中可以调用其他函数。
生成器函数
- 包含yield语句的函数可以用来创建生成器对象,这样的函数也称生成器函数。
- yield语句与return语句的作用相似,都是用来从函数中返回值。与return语句 不同的是,return语句一旦执行会立刻结束函数的运行,而每次执行到yield 语句并返回一个值之后会暂停或挂起后面代码的执行,下次通过生成器对象 的 next ()方法、内置函数next()、for循环遍历生成器对象元素或其他方式 显式“索要”数据时恢复执行。
- 生成器具有惰性求值的特点,适合大数据处理
- 生成器对象支持序列解包。
python 函数
原文:https://www.cnblogs.com/c1utchfan/p/12608736.html