'''
# -*- coding: -*-
# vim:fileencoding=
'''
# 如:
# -*- coding: utf-8 -*-
一般来说,Python会删除那些不再使用的对象(因为使用者不会再通过任何变量或者数据结构引用它们)。例如将某名字绑定的值设为None,其原本绑定的值会“漂”在内存里面,没有任何名字绑定到它上面。没有办法获取和使用它,所以Python解释器会直接删除该值,这种行为被称为垃圾收集。
另一个方法就是使用 del 语句。使用 del 删除的只是名称,而不是值。事实上,在Python是没办法删除值的(也不需要过多考虑删除值的问题,因为在某个值不再使用的时候,Python解释器会负责内存的回收)。
以下值被视为False
① None
② False
③ 任何数值类型的零,例如,0、 0L、0.0、 0j。
④ 任何空的序列,例如, ‘’、 ()、 []。
⑤ 任何空的映射,例如,{}。
⑥ 用户定义的类的实例,如果该类定义一个__nonzero__()或__len__()的方法,在该方法返回整数零或布尔值False时
'''
bool(val)
val被视为 False 则返回 False ,否则返回 True
'''
import math
bool(None) # False
bool(0j) # False
bool() # False
bool({}) # False
bool(math.nan) # True
操作 | 含义 | 结果 |
---|---|---|
x or y | 如果x为假,那么返回y,否则返回x | 0 or 2 输出结果:2 |
x and y | 如果x为假,那么返回x,否则返回y | 0 and 2 输出结果:0 |
not x | 如果x为假,那么返回True,否则返回False | not 1 输出结果:False |
操作 | 含义 | 结果 |
---|---|---|
< | 严格地小于 | 1 < 2 输出结果:True |
<= | 小于或等于 | 1 <= 2 输出结果:True |
> | 严格地大于 | 1 > 2 输出结果:False |
>= | 大于或等于 | 1 >= 2 输出结果:False |
== | 等于 | 1 == 2 输出结果:False |
!= | 不等于 | 1 != 2 输出结果:True |
is | 对象ID是否相同 | a = b = 1,a is b 输出结果:True |
is not | 对象ID是否不同 | a = b = 1,a is not b 输出结果:False |
原码:第一位表示符合(1为负0为正),其余位表示值
反码:正数的反码即原码,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
补码:正数的补码即原码,负数的补码是在反码的基础上+1
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
操作 | 含义 | 结果 |
---|---|---|
x | y | x和y的(补码)按位或(有1为1,其余为0) | 0 | 1 = 1,0 | -1 = -1 |
x ^ y | x和y的(补码)按位异或(两数相同结果为0,相异结果为1) | 0^1 = 1 |
x & y | x和y的(补码)按位与(有0为0,其余为1) | 0 & 1 = 0,0 & -1 = 0 |
x << n | x(补码)左移n位,右边缺少的补0 | 1 << 2 = [100]补 = 4,-1 << 2 = [11111100]补 = -4 |
x >> n | x(补码)右移n位,左边缺少的地方补符号位(即正数补0,负数补1) | 1 >> 2 = 0,-1 >> 2 = [11111111]补 = -1 |
~x | x(补码)按位取反 | ~1 = [11111110]补 = -2 |
if 判断条件1:
执行语句1……
elif 判断条件2:
执行语句2……
elif 判断条件3:
执行语句3……
else:
执行语句4……
for var in sequence:
执行语句……
for var in sequence:
执行语句1……
else:
执行语句2……
for 循环可使用 else 语句,在 python 中,for … else 表示这样的意思,for 中的语句和普通的没有区别,else 中的语句会在循环正常执行完(即 for 不是通过 break 跳出而中断的)的情况下执行,while … else 也是一样。
while 判断条件:
执行语句……
while 判断条件:
执行语句1……
else:
执行语句2……
break语句和C中的类似,用于跳出最近的 for 或 while 循环。
continue语句和C中的类似,表示继续下一次迭代。
pass语句什么也不做。它用于语法上必须要有一条语句,但程序什么也不需要做的场合。它通常用于创建最小的类。
filter(function, sequence)返回的序列由 function(item) 结果为真的元素组成。如果sequence是一个字符串或元组,结果将是相同的类型;否则,结果将始终是一个列表。
def f(x): return x > 0
list(filter(f, range(-2,3))) # [1, 2]
map(function, sequence) 为序列中的每一个元素调用 function(item) 函数并返回结果的列表。可以传入多个序列;此时,传入的函数也必须要有和序列数目相同的参数,执行时会依次用各序列上对应的元素来调用函数(如果某个序列比另外一个短,就用 None 代替)。
def f(x, y): return x*2-y
list(map(f, range(-2,3), range(1, 6))) # [-5, -4, -3, -2, -1]
可以使用lambda关键字创建小的匿名函数。语法:lambda [arg1 [,arg2,…argn]]:expression
list(filter(lambda x : x > 0, range(-2,3))) # [1, 2]
list(map(lambda x, y : x*2-y, range(-2,3), range(1, 6))) # [-5, -4, -3, -2, -1]
# 序列解包
x, y, z = 1, 2, 3
x, y, z # (1, 2, 3)
x, y = y, x
x, y, z # (2, 1, 3)
# 链式赋值
x = y = somefunction()
# 等价于
y = somefunction()
x = y
'''
指定一个加星号的参数,参数前的星号将所有值放置在一个元组中
'''
def print_params(*params):
print params
print_params('params') # ('params',)
print_params(1, 2, 3) # (1, 2, 3)
'''
可以跟参数联合使用
'''
def print_params(title, *params):
print title, params
print_params(1, 2, 3) # 1 (2, 3)
'''
指定一个加两个星号的参数,参数前的星号将所有值放置在一个元组中,指定关键字的保存在字典中
'''
def print_params(title, *params1, **params2):
print title, params1, params2
print_params('params') # params () {}
print_params(1, 2, 3) # 1 (2, 3) {}
print_params('title', x = 1, y = 2, z = 3) # title () {'y': 2, 'x': 1, 'z': 3}
'''
反转
'''
def add(x, y):
return x + y
params = (1, 2)
add(*params) # 3
def print_params(**params):
print params['width'], params['height']
params = {'width': 10, 'height': 20}
print_params(**params) # 10 20
类名 | 描述 |
---|---|
Exception | 所有异常的基类 |
AttributeError | 特性引用或赋值失败时引发 |
IOError | 试图打开不存在文件(包括其他情况)时引发 |
IndexError | 在使用序列中不存在的索引时引发 |
KeyError | 在使用映射中不存在的键时引发 |
NameError | 在找不到名字(变量)时引发 |
SyntaxError | 在代码为错误形式时引发 |
TypeError | 在内建操作或者函数应用于错误类型的对象时引发 |
ValueError | 在内建操作或者函数应用于正确类型的对象但是该对象使用不合适的值时引发 |
ZeroDivisionError | 在除法或者模除操作的第二个参数为0时引发 |
'''
捕捉异常可以使用try/except语句。
try/except 语句用来检测 try 语句块中的错误,从而让 except 语句捕获异常信息并处理。
try:
<语句> # 运行别的代码
except :
<语句> # 如果在try部份引发了'name'异常,name可以是元组(指定多个异常)
except as :
<语句> # 如果引发了'name'异常,获得附加的数据msg
else:
<语句> # 如果try语句没有异常发生,else语句会被执行
'''
'''
try/finally 语句无论是否发生异常都将执行最后的代码。
如果需要确保某些代码不管是否有异常引发都要执行,那么这些代码可以放置在 finally 子句中。
try:
<语句>
finally:
<语句> #退出try时总会执行
'''
try:
a = 1/0
print('right')
except (ZeroDivisionError, IOError) as msg:
print('error:', msg)
else:
print('else')
finally:
print('finally')
# 输出:
# error: division by zero
# finally
我们可以使用raise语句自己触发异常。
def f( x ):
if x < 1:
raise Exception("low x!")
# 触发异常后,后面的代码就不会再执行
try:
f(0)# 触发异常
except Exception as msg:
print('error:', msg)
else:
print('else')
# 输出:error: low x!
可以通过创建一个新的异常类来拥有自己的异常。异常类继承自 Exception 类,可以直接继承,或者间接继承
class MyError(Exception):
def __init__(self, value):
self.value = value
def __str__(self):
return repr(self.value)
try:
raise MyError(2*2)
except MyError as e:
print('error:', e.value)
# 输出:error: 4
raise MyError('oops!')
# 报错:__main__.MyError: 'oops!'
import module
from module import somefunction
form module import *
import module as name
在模块里面,模块的名字(是一个字符串)可以由全局变量 name 的值得到。
import numpy
numpy.__name__ # 'numpy'
__name__ # '__main__'
内置函数 dir() 用来找出模块中定义了哪些名字。它返回一个排好序的字符串列表。
dir() # ['__annotations__', '__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']