python知识点2之单双下划线、参数基础及可变参数

本文详细介绍了Python中私有变量的实现机制及其作用,包括双下划线及单下划线变量的区别,并深入探讨了函数参数的多种类型,如位置参数、关键字参数、可变参数等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值