Python使用lambda表示匿名函数。匿名函数体只能是表达式。比如:
>>>add=lambdax,y:x+y>>>add(3,2)5
Python使用y if cond else x表示条件表达式。意思是当cond为真时,表达式的值为y,否则表达式的值为x。相当于C++和Java里的cond?y:x。
Python区分列表(list)和元组(tuple)两种类型。list的写法是[1,2,3],而tuple的写法是(1,2,3)。可以改变list中的元素,而不能改变tuple。在某些情况下,tuple的括号可以省略。tuple对于赋值语句有特殊的处理。因此,可以同时赋值给多个变量,比如:
>>>x,y=1,2#同时给x,y赋值,最终结果:x=1, y=2
特别地,可以使用以下这种形式来交换两个变量的值:
>>>x,y=y,x#最终结果:y=1, x=2
Python使用'(单引号)和"(双引号)来表示字符串。与Perl、Unix Shell语言或者Ruby、Groovy等语言不一样,两种符号作用相同。一般地,如果字符串中出现了双引号,就使用单引号来表示字符串;反之则使用双引号。如果都没有出现,就依个人喜好选择。出现在字符串中的\(反斜杠)被解释为特殊字符,比如\n表示换行符。表达式前加r指示Python不解释字符串中出现的\。这种写法通常用于编写正则表达式或者Windows文件路径。
Python支持列表切割(list slices),可以获取完整列表的一部分。支持切割操作的类型有str, bytes, list, tuple等。它的语法是...[left:right]或者...[left:right:stride]。假定nums变量的值是[1, 3, 5, 7, 8, 13, 20],那么下面几个语句为真:
nums[2:5] == [5, 7, 8]从下标为2的元素切割到下标为5的元素,但不包含下标为5的元素。
nums[1:] == [3, 5, 7, 8, 13, 20]切割到最后一个元素。
nums[:-3] == [1, 3, 5, 7]从最开始的元素一直切割到倒数第3个元素。
nums[:] == [1, 3, 5, 7, 8, 13, 20]返回所有元素。改变新的列表不会影响到nums。
nums[1:5:2] == [3, 7]从下标为1的元素切割到下标为5的元素但不包含下标为5的元素,且步长为2
函数
Python的函数支持递归、默认参数值、可变参数、闭包,但不支持函数重载。为了增强代码的可读性,可以在函数后书写“文档字符串”(Documentation Strings,或者简称docstrings),用于解释函数的作用、参数的类型与意义、返回值类型与取值范围等。可以使用内置函数help()打印出函数的使用帮助。
函数调用时,实参可以如同C语言那样按照位置与形参匹配;也可以按照命名参数形式调用,即 param_name=value 形式的实参。在一个函数调用的实参表中,关键字引数必须出现在位置参数之后。
可变参数用*args或**dictargs表示,即在形式参数名字前加一个*号,表示这是由多个实参组成的可变参数,该形参视作tuple数据类型;在形式参数名字前加**号,表示这是由多个实参组成的可变参数,该形参视作dict数据类型。实际上,在一个"集合(collection)类型"(包括set、list、tuple甚至bytes、str等)的变量前加一个*号,获得了其中所有元素作为多个对象。
Python的函数作为第一类对象,具有和普通变量平等的地位。函数一旦定义,即可视作为普通对象,其形参会保留上次调用时的值,但在函数新的一次调用时会被实参值覆盖。因此函数的缺省参数值在连续多次调用该函数时,如果不被实参值覆盖,就会一直保留。例如:
deff(a,L=[]):L.append(a)returnLprint(f(1))print(f(2))print(f(3))
结果为:
[1]
[1, 2]
[1, 2, 3]
函数的缺省参数值在函数被定义时被一次性计算其初值。
Python的函数实参与形参之间的结合是传递对象的引用[8]。这是因为Python的赋值操作是把(变量)名字绑定到对象上。形实结合也是这种方式。如果形参绑定到一个可变的对象,则通过形参对此对象内容的修改,在函数外也是可见的。如果形参绑定到一个不可变的对象,则通过形参是不能修改此对象内容,但可以把形参重新绑定到其它对象上,这并不影响函数外的对象的值。例如:
deffoo(a):a.append('haha')defbar(b):b=101#实际上是重新绑定了另一个整型对象101a=[]b=100foo(a)bar(b)print(a)#结果为['haha']print(b)#结果为100