1、介绍
def 函数名(参数列表):
函数体
在python中,可以直接在.py文件中,通过关键字def创建函数。
2、函数与解释型
python是解释型编程语言,从上到下解析,所以在调用函数时,该函数必须已经被声明。
- 如果是在函数B声明之前,py文件中直接调用B,那么pycharm会提示异常
- 如果是在函数B声明之前,函数A中调用函数B
- 调用函数A的代码如果是在函数A之前,那么参考前一种场景,pycharm仍然报错
- 调用函数A的代码在函数A与B之间,那么pycharm不会报错,但是执行时会提示函数B未定义
- 调用函数A的代码在函数B之后,或者在其它py文件中,则正常执行
# A() # pycharm直接提示异常,函数A尚未定义
def A():
print('A')
B() # pycharm不会提示异常
# A() # pycharm不会提示异常,但是执行时提示B未定义
def B():
print('B')
A() # 正常执行
3、参数
3.1 形参和实参
(1)定义
- 形参:在函数声明处的括号里的参数。python是弱语言类型,形参只需要声明参数名称,而不需要声明类型
- 实参:调用函数时传入的值,决定对应形参的类型
(2)声明和使用
一般声明和使用函数时,需要形参与实参个数匹配,否则会报错
同时,函数内部使用形参,会根据参数作用预设类型,调用对应的方法和属性
所以,实参传递时不仅需要个数匹配,还需要类型匹配,否则会因为调用了形参所不具备的属性或方法而报错
换句话说,即形参列表和实参列表的一一对应
(3)形参的类型声明
def fun(name:str=''):
注意,这只是为了方便函数内部使用时,方便属性和方法的提示,并不会影响形参的类型或值
3.2 参数名设置
如果是直接设置实参,则实参的顺序必须和形参的顺序一致。
而如果全部或部分参数基于参数名设置实参,则可以相互颠倒。当然,实参个数仍然需要与实参个数一致
注意,如果是部分参数基于参数名设置,则这部分参数需要处于函数调用的后面部分,而前面部分直接设置的参数会一一与形参的前面部分对应传递和接收。否则,会报错
def fun(name:str, age:int, sex:str):
pass
fun('gg', 18, 'girl')
fun('zz', sex='boy', age=15)
fun(sex='boy', name='xc', age=20)
3.3 默认值
如果是不设置形参的默认值,则实参的个数和形参个数必须一致
而如果全部或部分形参设置了默认值,则可以对这些形参不设置实参,函数内部会使用默认值。当然,也是可以进行设置的
注意,如果是部分形参设置默认值,则这部分形参需要处于函数声明的后面部分,而前面部分为未设置默认值的形参。否则,会报错
def fun(name:str, age:int=18, sex:str='boy'):
pass
fun('zz')
fun('gg', 15)
fun('a', sex='girl')
3.4 不定长参数
不定长参数有两种形式:
- *args
- 如果需要,则在形参的末尾进行声明,重点是*字符,args可以是其它名称
- 用于接收函数中超出形参声明个数的实参,且超出部分实参是直接设置,而非通过参数名设置
- 在函数内,args作为tuple类型,用于读取接收的实参。当不存在超出范围的实参时,args为空tuple
def fun(name, *args):
print(args)
fun('aa', 'bb', 18) # 执行时,('bb', 18)
# fun('aa', 'bb', age=18) # 执行时,报错,不存在age
- **kwargs
- 如果需要,则在形参的末尾进行声明,重点是**字符,kwargs可以是其它名称
- 用于接收函数中超出形参声明个数的实参,且超出部分实参是通过参数名设置,而非直接设置
- 在函数内,kwargs作为dict类型,用于读取接收的实参。当不存在超出范围的实参时,args为空dict
def fun(name, address='',**kwargs):
print(kwargs)
# fun('aa', 'bb', 18) # 执行时,报错。超出接收个数
fun('aa', sex='boy', age=18) # {'sex': 'boy', 'age': 18}
- 混合
- 同时使用*args和**kwargs,必须是*args声明在前,否则pycharm会提示错误
- 仍然需要遵循使用参数名直接设置在后面部分
- 此时,超出形参声明个数的部分中,直接设置的会被args接收,使用参数名设置的会被kwargs接收
def fun(name, address='', *args, **kwargs):
print(args)
print(kwargs)
# fun('aa', 'bb', 18, 'ggz', sex='boy', address='uuu', age=20) # 执行时,报错。address被重放设置
fun('aa', 'bb', 18, 'ggz', sex='boy', email='uuu', age=20) # 执行时,报错。address被重放设置
"""
(18, 'ggz')
{'sex': 'boy', 'email': 'uuu', 'age': 20}
"""
3.5 传值和传地址
- 对于number、str和tuple是传值
- 对于其它类型是传地址
- 需要注意,传地址时,如果在函数内部对形参使用=进行赋值,那么就不再是传地址,不会对实参造成影响,而是另外创建或关联对象
4、其他
4.1 返回值
(1)函数可以没有返回值,执行完毕即退出。也相当于返回None值
(2)可以使用return关键字返回一个或多个值,用逗号分隔。
(3)return本身有立即结束函数的意思,可以不跟随参数,相当于返回None
(4)当返回多个值时,相当于返回一个tuple类型。此时要么用一个参数接收整个的tuple,要么用tuple长度的参数去分别接收tuple各元素,否则会报错
4.2 pass
作为占位的关键字,不执行任意功能
4.3 python不存在重载机制,即在一个函数中函数名必须唯一
5、匿名函数
基于lambda创建匿名函数,其只有一个表达式而非代码块
lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数
x = lambda a : a + 10
print(x(5))
6、特殊参数
实际上,模块、类、方法和函数都可以作为对象,被传递。
import os
print(type(os))
def fun1():
print('abc')
def fun2(fun):
print(type(fun))
fun()
fun2(fun1)
"""
<class 'module'>
<class 'function'>
abc
"""
7、私有函数和私有模块变量
所谓私有,即只能在当前py文件中使用,而不能在其它py文件中调用。
但是需要注意,私有函数和私有变量声明之后,在其他py文件中只有使用from ... import 导入,私有设置才有效。而直接通过import导入,则可以任意调用其公有或私有的函数和模块变量。
python中有两种方式定义私有函数和私有模块变量:
(1)添加_前缀
t1.py
name = 'abc'
_name2 = 'zzz'
def test():
print('111')
def _test2():
print('222')
t2.py
from t1 import *
print(name)
# print(_name2) # pycharm提示异常
test()
# _test2() # pycharm提示异常
(2)在模块变量__all__中定义公有函数和公有模块变量
__all__在py文件的开始还是末尾,不影响
t1.py
__all__ = ['name', 'test']
name = 'abc'
name2 = 'zzz'
def test():
print('111')
def test2():
print('222')
t2.py
from t1 import *
print(name)
# print(name2) # pycharm提示异常
test()
# test2() # pycharm提示异常
标签:函数,形参,print,def,fun,实参,python3 From: https://www.cnblogs.com/wd404/p/17319117.html