一、函数
python中函数的基本格式则为:def+函数名+参数名+函数体+返回,python作为一门面向对象的语言,同样可分为类函数、实例函数。
# 定义一个函数
def add(x, y):
"""
函数的说明
:param x: 参数x的作用
:param y: 参数y的作用
:return: 函数返回什么
"""
return x + y
如果想要输出某个函数的描述,可以使用doc函数
# 可以使用函数名.__doc__输出函数描述
print(add.__doc__)
1、函数分类
python中函数可分为类函数、实例函数,除此一个类中默认还有构造函数。
(1)实例函数
使用def
定义的函数都是实例函数,实例函数的第一个参数必须是self
,但在调用函数时,self
不用传。实例函数使用实例调用,调用时现需要实例化。
class Cat:
"""
定义一个猫的类
"""
# 定义实例函数
def kind(self, x):
"""
猫叫的名字
"""
print("这是一只" + x)
def age(self, n):
"""
猫的年龄
"""
print("这只猫" + str(n) + "岁")
kit = Cat()
kit.kind("布偶")
kit.age(3)
(2)类函数
类函数定义时,需要使用@classmethod
,且类函数的第一个参数必须是cls
,cls
表示类本身,调用类函数时不用传。类函数使用类调用,调用方式为类.函数,不需要实例化。
class Dog:
"""
定义一个狗的类
"""
# 定义一个狗叫声的类函数
@classmethod
def beak(cls):
"""
狗叫的声音
"""
print("狗会汪汪叫")
# 定义一个狗吃食物的类函数
@classmethod
def eat(cls, food):
"""
狗吃食物
"""
print("狗吃" + food)
# 调用时不用传入cls参数
Dog.beak()
Dog.eat("骨头")
(3)构造函数
每一个类中都有构造函数,如果没有显式的定义一个构造函数,则使用默认的构造函数。构造函数的函数名为__init__
。
class bird:
"""
定义一个鸟的类
"""
# 显式声明构造函数
def __init__(self):
"""
类的构造方法
"""
print("---这是一个构造函数---")
def fly(self):
"""
定义一个类方法
"""
print("鸟会飞")
a = bird()
a.fly()
2、函数返回
(1)python中定义的函数可以没有参数和返回
def describe():
print("这是一个简单的描述")
(2)python中定义的函数可以没有参数但仍有返回
def describe():
return "这是一个简单的描述"
(3)python中定义的函数可以有参数但没有返回
def describe(m, n):
print("这是一个简单的描述")
(4)python中函数可以返回多个值
def describe(m, n):
return m + n, m * n
3、函数参数
函数的参数可概括为:位置参数、默认参数、可变参数列表、可变参数字典
(1)位置参数
调用函数时必须传入的参数,如果没有指定(参数名=值)这样的形式传入,那么就按顺序一一对应;如果指定(参数名=值),则按参数名对应传入,例如:add(1,2)、add(x=1,y=2)、add(y=2,x=1)、add(1,y=2),但不支持add(y=2,1)
def add(x, y):
return x + y
# 不同的调用传参
print(add(1, 2))
print(add(x=1, y=2))
print(add(y=2, x=1))
print(add(1, y=2))
(2)默认参数
被调用函数有默认值的参数,调用函数时,可以不传入参数,此时使用默认值;默认参数必须定义在位置参数之后,传入参数可以按顺序传入,也可以使用(参数名=值)的形式传入
# a为位置参数,b=3, c=2为默认参数
def add(a, b=3, c=2):
return a + b + c
# 结果是6
print(add(1))
# 结果是5
print(add(1, 2))
# 结果是4
print(add(1, b=1, c=2))
# 结果是4
print(add(1, c=2, b=1))
# 结果是6
print(add(1, c=2))
默认参数建议指向不变对象,如果初始值为空,可以赋值None
def age(self, n=None):
"""
猫的年龄
"""
print("这只猫" + str(n) + "岁")
(3)可变参数列表(*args
)
将传入的参数作为元组
如果默认参数出现在*args
前面,调用函数时,默认参数只能按顺序传入。
def add(x, y, a=1, b=2, *args):
print(x, y)
print(a, b)
print(args)
add(3, 5, 4, 7, 8, 9)
调用结果为:
如果默认参数出现在*args
后面,则调用时必须使用(参数名=值)的形式传入。
def add(x, y, *args, a=1, b=2):
print(x, y)
print(a, b)
print(args)
add(3, 5, 4, 7, 8, 9)
调用结果为:
默认参数按照(参数名=值)形式传入
def add(x, y, *args, a=1, b=2):
print(x, y)
print(a, b)
print(args)
add(3, 5, 4, 7, 8, 9, a=0, b=0)
调用结果为:
如果*args传入参数为列表,可使用*列表
的方式传入
def add(x, y, *args, a=1, b=2):
print(x, y)
print(a, b)
print(args)
l = [8, 8, 8, 8]
add(3, 5, *l, a=0, b=0)
调用结果为:
(4)可变参数字典(**kwargs
)
传入的键值对参数会被转为字典
如果参数有*args
参数,可变参数字典(**kwargs)
必须放在其后
def add(x, y, *args, a=1, b=2, **kwargs):
print(x, y)
print(a, b)
print(args)
print(kwargs)
add(3, 5, 6, 6, a=4, b=7, 地址="上海")
调用结果为:
如果 **kwargs
传入参数为字典,可使用**字典
的方式传入
def add(x, y, *args, a=1, b=2, **kwargs):
print(x, y)
print(a, b)
print(args)
print(kwargs)
d = {"name": "Jim", "age": 18, "sex": 'f'}
add(3, 5, 6, 6, a=4, b=7, **d)
调用结果为:
二、变量
从变量的作用域划分,变量分为全局变量和局部变量,从变量的调用方式划分,变量分为类变量和实例变量。
1、全局变量与局部变量
全局变量即在整个模块中均能使用的变量,用global引用,局部变量即为只在当前函数中能够使用的变量。
animal = "动物" # 定义全局变量
class Cat:
"""
定义一个猫的类
"""
def age(self, n=None):
"""
猫的年龄
"""
global animal # 引用全局变量
cat = "猫" # 定义局部变量
print(animal+cat + str(n) + "岁")
2、类变量与实例变量
类变量即为定义在类中且在函数体之外的变量,所有类的实例化对象都共享类变量,类变量通常不作为实例变量使用;实例变量则是在构造函数中使用self定义的变量,实例变量尽量在实例和实例函数中使用。
class bird:
"""
定义一个鸟的类
"""
leg = "两只爪子" # 类变量
# 显式声明构造函数
def __init__(self):
"""
类的构造方法
"""
self.voice = "叽叽咋咋" # 实例变量
print("---这是一个构造函数---")
def Honking(self):
"""
定义一个类方法
"""
print(self.voice)