1.单、双下划线
1.1双下划线__foo(x):
私有变量,只有类对象自己能访问,连子类对象都不能访问到这些数据。变量私有,保证外部代码不能随意修改对象内部状态,通过访问限制的保护,代码更加健壮。
1.2单下划线_foo(x):
保护变量,只有类对象和子类对象可以访问。外部可访问(通过类提供的接口),但请视为私有,不要随意访问。
1.3 以双下划线开头和结尾_ _ foo(x)_ _:
python 中特殊方法专用的表示,如_ _ init_ ()代表类的构造函数, _ slots_ _可限制该类的实例可增加的属性。用来区别其他用户自定义的命名,以防冲突。
class MyClass(self):
def __init__(self):
self.__superprivate="Hello"
self._semiprivate=",world!"
mc=MyClass()
print mc.__superprivate #报错,不存在该属性
print mc._semiprivate #,world!
print mc.__dict__ #{'_MyClass__superprivate':'Hello','_semiprivate':',world!'}
2. 可变参数以及关键字参数
2.1.向函数中传递参数使用
可变参数(*args):
如果我们不确定要往函数中传入多少个参数,或者我们想往函数中以列表和元组的形式传参数时,那就使要用*args,如例1;
关键词参数(**kwargs):
如果我们不知道要往函数中传入多少个关键词参数,或者想传入字典的值作为关键词参数时,那就要使用**kwargs,如例2。
例1:
def print_everything(*args):
for count,thing in enumerate(args):
print '{0}.{1}'.format(count,thing)
print_everything('apple','banana','cabbage')
#0. apple
#1. banana
#2. cabbage
例2:
def table_things(**kwargs):
for name, value in kwargs.items():
print '{0} = {1}'.format(name, value)
table_things(apple = 'fruit', cabbage = 'vegetable')
#cabbage = vegetable
#apple = fruit
2.2调用函数时使用
python中也允许在list或tuple前加” * “号,把list或tuple的元素变成可变元素传进去。
def print_three_things(a, b, c):
print 'a = {0}, b = {1}, c = {2}'.format(a,b,c)
mylist = ['aardvark', 'baboon', 'cat']
print_three_things(*mylist)
#a = aardvark, b = baboon, c = cat
它可以传递列表(或者元组)的每一项并把它们解包.注意必须与它们在函数里的参数相吻合.
2.3结合使用*args以及**kwargs
对于任何函数,都可以通过任意类似func(*args,**kwargs)的形式调用它。
3.参数基础
3.1位置参数:
调用函数时根据函数定义的参数位置来传递参数。
def print_hello(name, sex):
sex_dict = {1: u'先生', 2: u'女士'}
print 'hello %s %s, welcome to python world!' %(name, sex_dict.get(sex, u'先生'))
#两个参数的顺序必须一一对应,且少一个参数都不可以
print_hello('tanggu', 1)
3.2关键字参数:
用于函数调用,通过“键-值”形式加以指定。可以让函数更加清晰、容易使用,同时也清除了参数的顺序需求。
#以下是用关键字参数正确调用函数的实例
print_hello('tanggu', sex=1)
print_hello(1, name='tanggu')
print_hello(name='tanggu', sex=1)
print_hello(sex=1, name='tanggu')
#以下是错误的调用方式
print_hello(name='tanggu', 1)
print_hello(sex=1, 'tanggu')
有位置参数时,位置参数必须在关键字参数的前面,但关键字参数之间不存在先后顺序的
3.3默认参数:
用于求幂(默认求平方)等,可简化函数的调用。
def say(message,times=1):
for i in range(times):
print message
注意:
1.默认参数必须指向不变对象
2.只有在形参表末尾的那些参数可以有默认参数值
3.4命名关键字参数
命名关键字参数必须传入参数名,与位置参数不同。
def person(name,age,*,city,job):
print name,age,city,job
person('Jack',24,city='Beijing',job='docter')
3.5位置参数、默认参数、可变参数的混合使用
基本原则是:先位置参数,默认参数,可变参数,关键字参数(定义和调用都应遵循)
def func(name, age, sex=1, *args, **kargs):
print name, age, sex, args, kargs
func('tanggu', 25, 2, 'music', 'sport', class=2)
#tanggu 25 1 ('music', 'sport') {'class'=2}
参考:
https://stackoverflow.com/questions/3394835/args-and-kwargs
https://www.cnblogs.com/bingabcd/p/6671368.html