Python基础总结

包裹和解包裹,并不是相反操作,是两个独立的过程。参考 ref 里的包裹传递和解包裹。

包裹传递:

在定义函数时,我们有时候并不知道调用的时候会传递多少个参数。这时候,包裹(packing)位置参数,或者包裹关键字参数,来进行参数传递,会非常有用。

下面是包裹位置传递的例子:

def func(*name):
    print type(name)
    print name

func(1,4,6)
func(5,6,7,1,2,3)
 

包裹关键字传递的例子:

def func(**dict):
    print type(dict)
    print dict

func(a=1,b=9)
func(m=2,n=1,c=11)
与上面一个例子类似,dict是一个字典,收集所有的关键字,传递给函数func。为了提醒Python,参数dict是包裹关键字传递所用的字典,在dict前加**。

包裹传递的关键在于定义函数时,在相应元组或字典前加*或**。

 

解包裹:

*和**,也可以在调用的时候使用,即解包裹(unpacking), 下面为例:

def func(a,b,c):
    print a,b,c

args = (1,3,4)
func(*args)
在这个例子中,所谓的解包裹,就是在传递tuple时,让tuple的每一个元素对应一个位置参数。在调用func时使用*,是为了提醒Python:我想要把args拆成分散的三个元素,分别传递给a,b,c。(设想一下在调用func时,args前面没有*会是什么后果?)

相应的,也存在对词典的解包裹,使用相同的func定义,然后:

dict = {'a':1,'b':2,'c':3}
func(**dict)
在传递词典dict时,让词典的每个键值对作为一个关键字传递给func。

 
View Code

总结:

包裹传递是,函数定义的时候是一个参数(带*的),调用的时候是多个参数;

解包裹是,函数定义的时候是多个参数,调用的时候是一个参数(带*的,元组)。

 

循环对象

相对于序列,用循环对象的好处在于:不用在循环还没有开始的时候,就生成好要使用的元素。所使用的元素可以在循环过程中逐次生成。这样,节省了空间,提高了效率,编程更灵活。

 

生成器的意义?

 

关于__name__

When the Python interpreter reads a source file, it executes all of the code found in it. Before executing the code, it will define a few special variables. For example, if the python interpreter is running that module (the source file) as the main program, it sets the special __name__ variable to have a value "__main__". If this file is being imported from another module, __name__ will be set to the module's name.

refer: http://stackoverflow.com/questions/419163/what-does-if-name-main-do
View Code

vamei在blog里也提到了__main__的巧妙用法。

总之,利用__main__可以区分开一个.py文件是被直接运行的(此时代码里的__name__=__main__),还是被其他.py文件import之后调用的(此时代码里的__name__=调用该模块名)。

例子:

有两个.py文件:p9.py和p10.py

# p9.py
if __name__ == '__main__':
    print 'this is p9'
# p10.py
import p9
x = 1
y = 2

当执行 python p9.py 时,会输出print的内容 “this is p9”。当执行 python p10.py 时,不会输出该内容。

此时如果在p9.py中输出__name__的话会发现,__name__值即为模块名/文件名:p9

作为对比,看看将p9.py里的if删去会怎样。删除后的p9.py如下。(p10.py未做改变)

# p9.py
print 'this is p9'

当执行 python p9.py 时,会输出print的内容 “this is p9”。当执行 python p10.py 时,同样会输出“this is p9”。

此外,还可以参考此文

 

使用中文:如果想要在python程序中使用中文,需要在Python程序的第一行加入#coding=utf8

注释:注释应该和所在的程序块对齐。

输入:raw_input()和input()

raw_input() 将所有输入作为字符串看待,返回字符串类型。

而对于 input() ,它希望能够读取一个合法的 python 表达式,即你输入字符串的时候必须使用引号将它引起来,否则它会引发一个SyntaxError。

input() 本质上还是使用 raw_input() 来实现的,只是调用完 raw_input() 之后再调用 eval() 函数。

除非对 input() 有特别需要,否则一般情况下我们都是推荐使用 raw_input() 来与用户交互。

ref1

输出:如果想要不换行:

python 2.x, print 不换行
>>> print x,
python 3.x print 不换行
>>> print(x, end="")

posted @ 2016-05-12 09:27  Ryan in C++  阅读(242)  评论(0编辑  收藏  举报