• Python中的变量

c/c++、java等语言在定义变量时,必须指定变量的数据类型,如果赋值时类型不匹配则会报错。与这些静态语言不同的是,Python在定义变量时不必指定数据类型,赋值的类型决定变量的类型,如a = 123a='abc',因此Python中的变量在定义时必须同时进行初始化。

Python中的变量可理解为具体对象的标识或是指代,以下例子将对此进行说明:

a = 'abc' 
b = a 
a = 'xyz'

当执行a = 'abc'时,Python解释器首先在内存中创建一个’abc’字符串对象,之后创建一个名为a的变量,并将它指向’abc’字符串对象;接着执行b = a时,解释器只是另外创建一个名为b的变量,并将它同样指向’abc’字符串对象;之后执行a = 'xyz'时,解释器在内存中另外创建一个’xyz’字符串对象,之后将变量a指向该字符串对象。若去掉中间一句,即相继执行a = 'abc'a = 'xyz',那么解释器在将变量a指向’xyz’字符串后,由于没有变量指向’abc’字符串,因此’abc’字符串被自动释放。

从以上过程可以看到,变量仅仅是对象的“别名”,变量指向对象,运算和各种操作的主体是内存中的对象。

  • Python中的代码块

在c/c++、java等语言中,使用大括号{}括起来的部分称作代码块,而在Python中使用冒号和缩进(四个空格)来表示代码块,如:

age = 20
if age >= 18:
    print('adult')
else:
    print('teenager')

从以上代码可以看到,与c++不同if之后的判断条件不需要使用括号()括起来,在Python中if、for、while等之后的条件都不需要使用括号括起来,直接列出即可。另外在Python中也不需要使用分号;来标识一句代码结束。

  • Python中的函数

在Python中,定义一个函数要使用def语句,依次写出函数名、括号、括号中的参数和冒号:,然后,在缩进块中编写函数体,函数的返回值用return语句返回。如定义一个求绝对值的函数my_abs:

def my_abs(x):
    if x<0:
        return -x
    else:
        return x

在Python中如果想定义一个什么事也不做的空函数,可以用pass语句:

def nop():
    pass

在写代码时,如果遇到具体的代码块还没有想好怎么写,可以使用pass来作占位符,让程序可以先运行起来。

由于Python中的变量可以是任何类型,因此对于函数的参数类型检查需要我们自己实现,可以使用内置函数isinstance():

def my_abs(x):
    if not isinstance(x, (int, float)):
        raise TypeError('bad operand type')
    if x<0:
        return -x
    else:
        return x

与c/c++、java不同,Python中的函数可以返回多个值,如:

def move(x,y,step):
    nx = x + step
    ny = y + step
    return nx,ny
  • 函数的参数

Python的函数定义非常简单,但灵活度却非常大。除了正常定义的必选参数外,还可以使用默认参数、可变参数和关键字参数等。

位置参数:即必选参数,在调用时必须给出具体参数。如my_abs(x)

默认参数:即参数带有默认值,调用时不给出具体参数则使用默认值。如my_pow(x,n=2)。需要注意的是,默认参数必须指向不可变对象,对于以下例子:

def add_end(L=[]):
    L.append('end')
    return L

当多次调用add_end()函数将输出错误的结果:

print(add_end())    #输出['end']
print(add_end())    #输出['end','end']
print(add_end())    #输出['end','end','end']

这是因为Python函数在定义的时候,默认参数L的值就被计算出来了,即[],因为默认参数L也是一个变量,它指向对象[],每次调用该函数,如果改变了L的内容,则下次调用时,默认参数的内容就变了,不再是函数定义时的[]了。

可变参数:即传入的参数个数是可变的。在Python中,在参数前加上星号*表示可变参数,如:

def my_sum(*numbers):
    sum=0
    for n in numbers:
        sum+=n
    return sum

对于可变参数,Python实际上是将它们组装一个元组,因此函数可以处理任意个数的参数。

关键字参数:可传入任意个含参数名的参数。在Python中,在参数前加上两个星号**表示关键字参数,如:

def person(name,age,**kw):
    print('name:',name,'age:',age,'other:',kw)

关键字参数在传入函数内部时自动组装为一个字典dict,关键字参数主要用于扩展函数的功能。

命名关键字参数:限制关键字参数的名称。例如对于上面的person函数,如要限制传入的关键字参数为’city’和’job’:

def person(name,age,*,city,job):
    print('name:',name,'age:',age,'city:',city,'job:',job)

和关键字参数**kw不同,命名关键字参数需要一个特殊分隔符**后面的参数被视为命名关键字参数。如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:

def person(name,age,*args,city,job)

命名关键字参数也可以有缺省值,从而简化调用:

def person(name,age,*args,city='beijing',job)

参数组合:在Python中,可以用必选参数、默认参数、可变参数、关键字参数和命名关键字参数,这5种参数都可以组合使用。但是要注意,参数定义的顺序必须是:必选参数、默认参数、可变参数、命名关键字参数和关键字参数。