运算符
这里只列出与 C 语言有差异的地方。
- 算术运算符
运算符 | 描述 | 实例 |
---|---|---|
** | 幂 - 返回x的y次幂 | a**b 为10的20次方, 输出结果 100000000000000000000 |
// | 取整除 - 返回商的整数部分 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
- 比较运算符,没有
|| &&
,换为and / or / not
运算符 | 描述 | 实例 |
---|---|---|
<> | 不等于 - 比较两个对象是否不相等 | (a <> b) 返回 true。这个运算符类似 != 。 |
- 赋值运算符
运算符 | 描述 | 实例 |
---|---|---|
+= | 加法赋值运算符 | c += a 等效于 c = c + a |
-= | 减法赋值运算符 | c -= a 等效于 c = c - a |
*= | 乘法赋值运算符 | c = a 等效于 c = c a |
/= | 除法赋值运算符 | c /= a 等效于 c = c / a |
%= | 取模赋值运算符 | c %= a 等效于 c = c % a |
**= | 幂赋值运算符 | c = a 等效于 c = c a |
//= | 取整除赋值运算符 | c //= a 等效于 c = c // a |
- 位运算符
运算符 | 描述 | 实例 |
---|---|---|
^ | 按位异或运算符:当两对应的二进位相异时,结果为1 | (a ^ b) 输出结果 49 ,二进制解释: 0011 0001 |
~ | 按位取反运算符:对数据的每个二进制位取反,即把1变为0,把0变为1 。~x 类似于 -x-1 | (~a ) 输出结果 -61 ,二进制解释: 1100 0011,在一个有符号二进制数的补码形式。 |
<< | 左移动运算符:运算数的各二进位全部左移若干位,由 << 右边的数字指定了移动的位数,高位丢弃,低位补0。 | a << 2 输出结果 240 ,二进制解释: 1111 0000 |
>> | 右移动运算符:把”>>”左边的运算数的各二进位全部右移若干位,>> 右边的数字指定了移动的位数 | a >> 2 输出结果 15 ,二进制解释: |
- 逻辑运算符
运算符 | 逻辑表达式 | 描述 | 实例 |
---|---|---|---|
and | x and y | 布尔”与” - 如果 x 为 False,x and y 返回 False,否则它返回 y 的计算值。 | (a and b) 返回 20。 |
or | x or y | 布尔”或” - 如果 x 是非 0,它返回 x 的值,否则它返回 y 的计算值。 | (a or b) 返回 10。 |
not | not x | 布尔”非” - 如果 x 为 True,返回 False 。如果 x 为 False,它返回 True。 | not(a and b) 返回 False |
- 成员运算符
除了以上的一些运算符之外,Python还支持成员运算符,测试实例中包含了一系列的成员,包括字符串,列表或元组。
运算符 | 描述 | 实例 |
---|---|---|
in | 如果在指定的序列中找到值返回 True,否则返回 False。 | x 在 y 序列中 , 如果 x 在 y 序列中返回 True。 |
not in | 如果在指定的序列中没有找到值返回 True,否则返回 False。 | x 不在 y 序列中 , 如果 x 不在 y 序列中返回 True |
- 身份运算符
运算符 | 描述 | 实例 |
---|---|---|
is | is 是判断两个标识符是不是引用自一个对象 | x is y, 类似 id(x) == id(y) , 如果引用的是同一个对象则返回 True,否则返回 False |
is not | is not 是判断两个标识符是不是引用自不同对象 | x is not y , 类似 id(a) != id(b)。如果引用的不是同一个对象则返回结果 True,否则返回 False。 |
语法
条件语句
1 | if condition: |
全局变量 global
全局变量一般不建议使用,但是写小脚本的时候可能用到。
全局变量定义只需要在最外层定义即可,在函数内使用时,用 global 指定变量为外层定义的全局变量。
样例:
1 | c = 0 # global variable |
运行结果:
1 | Inside add(): 2 |
数据结构
list
遍历列表
见 Python 列表(List) 的三种遍历(序号和值)方法,这里贴一下原作者 痞子泰 的代码备忘,
1 | #!/usr/bin/env python |
列表比较
python 2.7 直接使用 cmp() 函数比较,0 表示相等。
列表排序
详见 菜鸟教程,
1 | list.sort(cmp=None, key=None, reverse=False) |
key 表示要比较的元素,贴一下样例代码:
1 |
|
输出结果:
1 | 排序列表:[(4, 1), (2, 2), (1, 3), (3, 4)] |
dict
赋值:
1 | myDict = {} |
如果使用不当时,key 找不到,会出现 KeyError。此时通过 myDict.get(b’test’, None),判断返回值是否为 None,再进行进一步的操作。
copy 赋值、浅复制和深复制的差异
http://www.runoob.com/w3cnote/python-understanding-dict-copy-shallow-or-deep.html
集合(set)
集合,内置函数,set(['a', 'b'])
,可将列表的数据转换为集合,也是列表格式。
1 | $ python |
多线程处理
这里先只讨论 python 2.7 的。
线程和锁都隶属 threading 库。
threading 库包含几种 objects:
- Thread,创建、启动线程
- Lock,普通锁,不支持嵌套
- Rlock,嵌套锁
- Condition,条件锁
- Semaphore,信号量
- Timer,定时器
- Event
Thread
在 with 语句中使用 locks, conditions, and semaphores
log
两种格式化方法:
- 使用 format,
print '{name} {test}'format(name='yyy', test='zzz')
- 原生,
print '%s %s'%('yyy', 'zzz')
syslog
相比 logging,syslog 比较简单易入手,不过没有 logging 灵活。
1 | syslog.syslog('%%Hello: %s'%('your_name')) |
logging
个人觉得比 syslog 好用,可以同时输出到 console 和文件中。
注意 logging 比较复杂,比如在 class 中用,和在 main 函数中用,写法有很多差异。
1 | jeromesun@km:~/workshop/python$ python test_logging.py |
常用工具
延迟几秒
1 | import time |
字符串对比
if a == 'abcdefg'
常见 error
TypeError: 'NoneType' object is not iterable in Python
遍历时,对应的 list 或 dict 为空。详见 https://stackoverflow.com/questions/3887381/typeerror-nonetype-object-is-not-iterable-in-python。
可通过 or []
或 or {}
规避。
1 | for i in data or []: |
RuntimeError: dictionary changed size during iteration
字典 items() 和 iteritems() 的差异,都是遍历。前者能遍历中删除的原因是,拷贝内存处理。
iteritems 使用时,不能变动字典的大小,即不能增删成员。
1 | jeromesun@km:~/workshop$ python test_copy.py |
items 遍历的性能,在元素多的情况下,差很多:
1 | jeromesun@km:~/workshop$ python test_copy.py |
问题
多线程 python 程序运行时无法 ctrl + c 退出
how-to-exit-the-entire-application-from-a-python-thread 提到了几种解法,但是经过验证,发现 signal 的方法可行性最高。
作为代码搬运工,找到了一个样例代码:How to terminate running Python threads using signals
1 | import time |
运行结果:
1 | jeromesun@km:~/workshop/python$ python thread_signal.py |