函数,在定义的时候,可以有参数的,也可以没有参数。
混合传参要求位置传参在前,一旦开始关键字传参,后面所有参数必须用关键字传参。
函数参数传递的是实际对象的内存地址。如果参数是引用类型的数据类型(列表、字典等),在函数内部修改后,就算没有把修改后的值返回回去,外面的值其实也已经发生了变化。
"""
def my_function(arg):
print(arg)
my_function(10) #################
def my_function(arg=10):
print(arg)
my_function(60) #################
def my_function(a, b, c, d):
print(a, b, c, d)
print('位置传参:', end='')
my_function(10, 20, 30, 40) #################
def my_function(a, b, c, d):
print(a, b, c, d)
print('关键字传参:', end='')
my_function(d=10, c=20, b=30, a=40) #################
def my_function(a, b, c, d):
print(a, b, c, d)
print('关键字传参:', end='')
my_function(10, d=20, c=30, b=40) #################
def my_function(*args):
print(args)
print(type(args))
print('可变位置参数:', end='')
my_function(60, 70, 80) #################
def my_function(**kw):
print(kw)
print(type(kw))
print('可变关键字参数:', end='')
my_function(a=60, b=70, c=80) #################
def my_function(a, b, c, *args, **kw):
print(f'位置参数:{a},{b},{c}')
print(f'可变位置参数:{args}')
print(type(args))
print(f'可变关键字参数:{kw}')
print(type(kw))
my_function(60, 100, 200, 300, 400, g=70, d=80, e=90, f=99) #################
def my_function(my_list):
my_list.append('我是函数内追加的哦')
list_a = [1, 2, 3]
print('函数调用前', list_a)
my_function(list_a)
print('函数调用后', list_a) #################
python类的调用有三大方法,分别是实例方法,类方法和静态方法。
在类编程中,一般情况下在类中定义的方法/函数默认都是实例方法。python的类编程中实例方法最大的特点就是最少要包含一个 self 参数,该self参数的作用是绑定调用此方法的实例对象。
self参数便是指向实例myhouse,类比C++中的this指针。
实例方法除了能够被实例本身调用外,还能够通过类名直接调用,但需要指定调用的实例对象,
Python 中的类方法和实例方法类似,但类方法需要满足以下要求:
类方法至少需要包含一个参数,与实例方法不同的是该参数并非self,而是python程序员约定俗成的参数:cls。Python 会自动将类本身绑定到cls参数(非类对象),故在调用类方法时,无需显式为 cls 参数传递参数。类方法需要使用修饰语句: @classmethod
类方法cls_func()即使通过实例对象my_house调用,其调用者也依然是__main__.House,而不是对象my_house
类中的静态方法,实际上就是大家众所周知的普通函数,存在的唯一区别是:静态方法在类命名空间中定义,而函数则在程序的全局命名空间中定义。静态方法需要使用修饰语句: @staticmethod
需要注意的是:
class House:
# 类构造方法,也是实例方法
def __init__(self, area, price):
self.area = area
self.price = price
def cls_func(self, arg):
print(arg)
my_house = House('America', 330) # 实例化类对象,需要传入init中的两个参数
print(f'类属性, my_house.price:{my_house.price}, my_house.area:{my_house.area}')
my_house.cls_func('通过实例化后的类对象调用类方法,忽略self')
House.cls_func(my_house, '通过未实例化的类名调用实例方法,需要给self传递实例化后的类对象名')
class House:
# 类构造方法,也是实例方法
def __init__(self, area, price):
self.area = area
self.price = price
@classmethod
def cls_func(cls, arg):
print(f'类方法:{cls}')
print(f'类方法中第二个参数:{arg}')
House.cls_func('我是类方法的第二参数')
my_house = House('America', 330) # 实例化类对象,需要传入init中的两个参数
print(f'类属性, my_house.price:{my_house.price}, my_house.area:{my_house.area}')
my_house.cls_func('通过实例化后的类对象调用类方法,忽略cls')
House.cls_func(my_house, '类方法的调用,不同于实例方法,无需传入实例化对象作为第一参数')
class House:
# 类构造方法,也是实例方法
def __init__(self, area, price):
self.area = area
self.price = price
@staticmethod
def stat_func(arg):
print(f'静态方法中参数:{arg}')
# print(self.area) # 语法错误,静态方法中没有self
House.stat_func('未通过实例化,直接类名调用静态方法,不需要传入实例化对象作为第一参数')
my_house = House('America', 330) # 实例化类对象,需要传入init中的两个参数
print(f'类属性, my_house.price:{my_house.price}, my_house.area:{my_house.area}')
my_house.stat_func('通过实例化后的类对象调用静态方法')
House.stat_func(my_house, '静态方法的调用,不同于实例方法,无需传入实例化对象作为第一参数')