文章目录
函数或者方法可以理解为将一系列的计算过程封装在一起,在实现相似的功能时,可以通过使用函数来减少代码量。
函数定义与调用
函数定义主要思考的问题是,这个函数实现什么功能,怎么才能使用它(参数),函数为调用者提供什么(返回值),函数如何实现等问题。
1.参数
1.1 参数值的类型
由于python语言中的变量都是引用型的变量,在函数定义时不需要特定的指出参数的类型。
def func(*arg1,**arg2):
print('function run')
但在python中可通过*
来表示函数接受0个或多个用,
分割的变量作为参数,用**
来表示函数可将0个或多个键值对作为参数。
# 不含参数
>>> func()
function run
# 使用多个变量做参数
>>> v1,v2=0
>>> func(v1)
function run
>>> func(v2)
function run
>>> func(v1,v2)
function run
# 使用键值对作为参数
>>> func(k1='1')
function run
>>> func(k1='r',k2='u',)
function run
>>> d = dict(k1='one',k2='two')
>>> func(d)
function run
1.2 必要参数及默认值
若将上述函数改为
def func(arg1,*arg2,**arg3):
print('function run')
其中arg1为必要(required)参数,arg2,arg3为可选(optional)参数。在调用函数时,若不给定arg1,就会提示缺少位置参数。
>>> func()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: func() missing 1 required positional argument:'arg1'
# 给定任意类型的arg1,甚至是计算表达式
>>> func(1)
function run
>>> func('hello')
function run
>>> func(3+2)
function run
在为必要参数arg1设置默认值后,可直接用函数名调用参数。修改函数为
def func(arg1='default',*arg2,**arg3):
print('function run')
print(arg1)
直接调用函数
>>> func()
fucntion run
arg1
1.3 参数排列
当函数含有多个必要参数,在调用函数时,可通过位置、关键字或两者组合,来标识传递的值对应哪一个参数。
>>> def func(arg1,arg2,arg3):
print('fucntion run')
print('{:} is arg1\'s value'.format(arg1))
print('{:} is arg2\'s value'.format(arg2))
print('{:} is arg3\'s value'.format(arg3))
# 按位置区分
>>> func(4,96,8)
fucntion run
4 is arg1's value
96 is arg2's value
8 is arg2's value
# 按关键字区分
>>> func(arg2='hello',arg1='hi',arg3='ok')
fucntion run
hi is arg1's value
hello is arg2's value
ok is arg3's value
# 按关键字和位置区分
>>> func('first',arg3='third',arg2='second')
fucntion run
first is arg1's value
second is arg2's value
third is arg3's value
#Ps:keyword argument、positional argument 同存在时,必须将位置参数放在前面
>>> func(arg3='third','second',arg1='first')
File "<stdin>", line 1
SyntaxError: positional argument follows keyword argument
1.4 参数传递
在其他语言中,如Java,参数传递分为值传递(传变量值)和引用传递(传变量的逻辑地址),他们之间的区别主要在函数能否改变原变量的值。
python 中的变量都是引用类型,故函数的参数传递都是引用传递。
如何做到控制能否改变元变量的值,python采用可变类型(list、dictionary)和不可变类型(tuple、string、number)来控制。
# 向列表中增加一个值
>>> def change(arg):
print(id(arg))
arg.append(3)
print(id(arg.append(3)))
# 传入可变类型
>>> b=[]
>>> id(b)
1934364555080
>>> change(b)
1934364555080
1934364555080
# 可见变量所对应的地址没有发生改变,实现了对原变量值的修改
>>> b
[3]
>>> id(b)
1934364555080
#传入不可变类型
# 试图将字符串首字母转化为大写
>>>def change(arg):
print(id(arg))
arg.capitalize()
print(id(arg.capitalize()))
>>>a = 'string'
>>>change(a)
1934363823048
1934366339904
# 调用capitalize()函数会生产新的字符串,原变量并未发生改变
>>>a
string
2.返回值
在函数的使用过程中,了解返回值的类型,有助于程序逻辑的编写。使用内建函数type()
查询返回值类型。
2.1 返回值为类
可直接使用类的方式以及属性。
>>> import datetime
>>> def func():
return datetime.date(2019,5,1)
>>> type(func())
<class 'datetime.date'>
# 使用help(module_or_class_name)函数查询模块或类的详细信息
>>> help(datetime.date)
Help on class date in module datetime:
class date(builtins.object)
| date(year, month, day) --> date object
.....................
# 直接使用类的方法,判断是星期几
>>> func().isoweekday()
3
# 直接查看类的(月份)属性
>>> func().month
5
2.2 返回值为基本数据类型
返回值为list、tuple、dictionary、number、string等基本数据类型,可以直接使用对象所含有的方法。
>>> def func():
return 'string'
>>> type(func())
<class 'str'>
# 返回值为字符类型数据,直接使用其split函数
>>> func().split('r')
['st', 'ing']
2.3 返回值为函数
使用lambda
表达式定义一个匿名函数。其语法为lambda arguments: return value or expression
def ReturnAFuction():
return lambda x:x**2
# 查看函数返回值类型
>>>type(ReturnAFuction())
<class 'function'>
# 将函数赋值给新变量
>>>f = ReturnAFuction()
>>>f(9)
>>>81
3.系统定义的函数变量
在定义函数时,python会为默认会为函数定义一些方法或属性。根据python的 变量命名规则 1 ,这些方法或者属性都属于系统定义的变量。可以在官方文档中查询所有系统定义的变量
>>> def func():
pass #函数体为空
>>> for i in dir(func):
... print(i)
...
__annotations__
__call__
__class__
__closure__
__code__
__defaults__
__delattr__
__dict__
__dir__
__doc__
__eq__
__format__
__ge__
__get__
__getattribute__
__globals__
__gt__
__hash__
__init__
__init_subclass__
__kwdefaults__
__le__
__lt__
__module__
__name__
__ne__
__new__
__qualname__
__reduce__
__reduce_ex__
__repr__
__setattr__
__sizeof__
__str__
__subclasshook__
部分系统属性或函数说明:
-
__doc__ 属性
该属性是对象(类、函数、模块)的描述。通常为对象体内第一个用3个单引号
'
或双引号''
的部分。如下例:>>> def func(): """This is a document for function func this area should be usge of this function """ """ normal comment """ return 'string' >>> func.__doc__ 'This is a document for function func\n \n this area should be usge of this function\n '
Python编码风格约定:如果文档字符串中有更多的行,那么第一行为对象的简要概述,第二行应该是空的,以将摘要与描述的其余部分分隔开。以下几行应该是一个或多个段落,描述对象的调用方法等。
除此之外,也可以通过 赋值给__doc__
的 这种方式,为函数添加说明。
- __call__() 方法调用函数
>>> func.__call__() >>> 'string'
- __name__ 属性,返回对象名
>>> func.__name__ >>> 'func'
- __class__属性,返回实例所属的类
- __module__属性,返回对象所属的模块
- __sizeof__() 方法,返回对象多占内存大小
>>> func.__sizeof__() >>> 112
内建函数
Python 内置了大约68个内建函数,不需要 import语句2 可直接使用。
下表为Python全部的内置函数,可以在这里查看官方文档中关于内建函数的功能以及使用方法。
– | – | – | – | – |
---|---|---|---|---|
abs() | dict() | help() | min() | setattr() |
all() | dir() | hex() | next() | slice() |
any() | divmod() | id() | object() | sorted() |
ascii() | enumerate() | input() | oct() | staticmethod() |
bin() | eval() | int() | open() | str() |
bool() | exec() | isinstance() | ord() | sum() |
bytearray() | filter() | issubclass() | pow() | super() |
bytes() | float() | iter() | print() | tuple() |
callable() | format() | len() | property() | type() |
chr() | frozenset() | list() | range() | vars() |
classmethod() | getattr() | locals() | repr() | zip() |
compile() | globals() | map() | reversed() | __import__() |
complex() | hasattr() | max() | round() | |
delattr() | hash() | memoryview() | set() |
常用内建函数说明:
函数 | 功能 |
---|---|
print() | 向控制台输出 |
input() | 从控制台输入 |
open() | 将文件操作 |
help() | 显示对象的帮助信息 |
type() | 查询对象类型 |
format() | 格式控制 |
len() | 对象包含的item个数 |
iter() | 使用可迭代对象生成一个迭代器 |
next() | 获取迭代器的下一个值 |
range() | 生成一个序列 |
dir() | 显示对象可用的属性和方法 |
注解
Python特殊变量命令含义
__name__
为系统变量,都可以访问到;
__name
为保护变量,模块中为不可见,但对于类来说,在父类中用此方式定义的变量或方法,子类可以使用_class__name
来访问,防止子类方法名重写(override后子类对象就不能直接调用父类的该方法,可以通过实例化父类对象调用)。不同于重载(overload 函数名相同,参数不同),重载可以发生在一个类中 ;
name
为普通变量;
name_
避免与python关键字重复(约定);
_name
不能使用from module import *
(通配符方式)引入该类型变量,但可通过常规方式from moudle._name import *
导入。 ↩︎import 包或者单个模块
将自己编写的module(单个.py
文件)或是第三方包放到 sys.path 所包含的文件夹下,就可以使用import语句导入自定的或者第三方包。 ↩︎