运算符
算术运算符
前面已经讲过了四则运算,其中涉及到一些运算符:加减乘除,对应的符号分别是:+ - * /,此外,还有求余数的:%。这些都是算术运算符。其实,算术运算符不止这些。根据中学数学的知识,也应该想到,还应该有乘方、开方之类的。
下面列出一个表格,将所有的运算符表现出来。
| 运算符 | 描述 | 实例 |
|---|---|---|
| + | 加 - 两个对象相加 | 10+20 输出结果 30 |
| - | 减 - 得到负数或是一个数减去另一个数 | 10-20 输出结果 -10 |
| * | 乘 - 两个数相乘或是返回一个被重复若干次的字符串 | 10 * 20 输出结果 200 |
| / | 除 - x除以y | 20/10 输出结果 2 |
| % | 取余 - 返回除法的余数 | 20%10 输出结果 0 |
| ** | 幂 - 返回x的y次幂 | 10**2 输出结果 100 |
| // | 取整除 - 返回商的整数部分 | 9//2 输出结果 4 , 9.0//2.0 输出结果 4.0 |
比较运算符
以下假设a=10,b=20:
| 运算符 | 描述 | 实例 |
|---|---|---|
| == | 等于 - 比较对象是否相等 | (a == b) 返回 False。 |
| != | 不等于 - 比较两个对象是否不相等 | (a != b) 返回 True. |
| > | 大于 - 返回x是否大于y | (a > b) 返回 False。 |
| < | 小于 - 返回x是否小于y | (a < b) 返回 True。 |
| >= | 大于等于 - 返回x是否大于等于y。 | (a >= b) 返回 False。 |
| <= | 小于等于 - 返回x是否小于等于y。 | (a <= b) 返回 True。 |
逻辑运算符
(假设a=10,b=20)
| 运算符 | 描述 | 实例 |
|---|---|---|
| and | 布尔”与” - 如果x为False,x and y返回False,否则它返回y的计算值。 | (a and b) 返回 20。 |
| or | 布尔”或” - 如果x是True,它返回True,否则它返回y的计算值。 | (a or b) 返回 10。 |
| not | 布尔”非” - 如果x为True,返回False。如果x为False,它返回True。 | not(a and b) 返回 false。 |
- and
and,翻译为“与”运算,但事实上,这种翻译容易引起望文生义的理解。
先说一下正确的理解。
A and B,含义是:
首先运算A,如果A的值是True,就计算B,并将B的结果返回做为最终结果,如果B是False,那么A and B的最终结果就是False,如果B的结果是True,那么A and B的结果就是True;
如果A的值是False ,就不计算B了,直接返回A and B的结果为False.
简单语句
在Python 2中,print是一个语句,但是在Python 3中它是一个函数了。这点请注意。
以Python 2为例,说明print语句。如果说读者使用的是Python 3,请自行将print xxx修改为print(xxx),其它不变。
print发起的语句,在程序中主要是将某些东西打印出来,还记得在讲解字符串的时候,专门讲述了字符串的格式化输出吗?那就是用来print的。
|
|
本来,在print语句中,字符串后面会接一个\n符号。即换行。但是,如果要在一个字符串后面跟着逗号,那么换行就取消了,意味着两个字符串”hello”,”world”打印在同一行。
但是,在Python 3中情况有变。默认的end=’\n’,如果不打算换行,可以在使用print()函数的时候,修改end这个参数的值。
|
|
import
import引入模块的方法,是Python编程经常用到的。引用方法有如下几种:
|
|
这是一种可读性非常好的引用方式,并且不同模块的同名函数不会产生冲突。
|
|
这种引用方法,比较适合于引入模块较少的时候。如果引入模块多了,可读性就下降了,会不知道那个函数来自那个模块。
|
|
将从某个模块引入的函数重命名,比如讲pow充命名为pingfang,然后使用pingfang()就相当于在使用pow()了
|
|
引入了math模块里面的pow,e,pi,pow()是一个乘方函数,e是那个欧拉数;pi就是π.
|
|
一下将math中的所有函数都引过来了。不过,这种方式的结果是让可读性更降低了。仅适用于模块中的函数比较少的时候,并且在程序中应用比较频繁。
事实上,不仅函数可以引入,模块中还可以包括常数等,都可以引入。在编程中,模块中可以包括各样的对象,都可以引入。
赋值
|
|
|
|
|
|
原来是将右边的两个值装入了一个元组,然后将元组赋给了变量a。
两个变量的值对调,python只要一行就完成了:
|
|
因为我前面已经数次提到的Python中变量和对象的关系。变量相当于贴在对象上的标签。这个操作只不过是将标签换个位置,就分别指向了不同的数据对象。
还有一种赋值方式,被称为“链式赋值”
|
|
用这种方式,实现了一次性对两个变量赋值,并且值相同。
|
|
用id()来检查一下,发现两个变量所指向的是同一个对象。
另外,还有一种判断方法,来检查两个变量所指向的值是否是同一个(注意,同一个和相等是有差别的。在编程中,同一个就是id()的结果一样。
|
|
这是在检查m和n分别指向的对象是否是同一个,True说明是同一个。
|
|
这是跟上面链式赋值等效的。
但是:
|
|
看出其中的端倪了吗?这次a、b两个变量虽然相等,但不是指向同一个对象。
还有一种赋值形式,如果从数学的角度看,是不可思议的,如:x = x + 1,在数学中,这个等式是不成立的。因为数学中的“=”是等于的含义,但是在编程语言中,它成立,因为”=”是赋值的含义,即将变量x增加1之后,再把得到的结果赋值变量x.
这种变量自己变化之后将结果再赋值给自己的形式,称之为“增量赋值”。+、-、*、/、%都可以实现类似这种操作。
为了让这个操作写起来省点事(要写两遍同样一个变量),可以写成:x += 1
|
|
除了数字,字符串进行增量赋值,在实际中也很有价值。
|
|
条件语句
if语句
|
|
- 必须要通过缩进方式来表示语句块的开始和结束
- 缩进用四个空格也是必须的
if…elif…else
|
|
三元操作符
|
|
总结一下:A = Y if X else Z
根据上述例子可以看出:
- 如果X为真,那么就执行A = Y
- 如果X为假,那么就执行A = Z
|
|
for循环
For循环的基本结构是:
for 循环规则: //需要冒号
操作语句 //语句要缩进
简单的for循环
|
|
range(start,stop,[,step])
range是个内建函数,一般形式是range(start,stop,[,step])
关于range()函数注意一下几点:
- 该函数可以创建一个数字元素组成的列表
- 该函数最常用于for循环
- 函数的参数必须是整数,默认从0开始
- step默认值是1,不写就是默认值
- step是正数,返回list最后的值不包含stop的值,即start + step的值小于stop;step是负数,start + step的值大于stop;
- step不能等于0
参数解释:
- start:开始数值,默认为0
- stop:结束数值,必须要写
- step:变化的步长,默认是1,不能为0
正数
|
|
负数
|
|
获取列表的索引值组成的列表
|
|
找出100以内的能够被3整除的正整数
|
|
for对象
|
|
字典遍历的多种写法
|
|
注意到,上面的循环,其实是读取了字典的key。在字典中,有一个方法,dict.keys(),得到的是字典key列表。
|
|
这种循环方法和上面的循环方法,结果是一样的,但是,这种方法并不提倡,以为它在执行速度上表现欠佳。
如果要获得字典的value怎么办?不要忘记dict.values()方法
|
|
用上面的方法,要把所有的内容都读入内存,内存东西多了,可能会出麻烦。为此,Python中提供了另外的方法。
|
|
这里是循环一个迭代器,迭代器在循环中有很多优势。除了刚才的dict.iteritems()之外,还有dict.itervalues(),dict.iterkeys()供你选用(以上三个dict.iter*都只用在Python 2中,Python 3中已经不需要了)
如何判断一个对象是不可迭代的?
|
|
引入collections这个标准库。要判断数字321是不是可迭代的,可以这么做:
|
|
返回了False,说明321这个整数类型的对象,是不可迭代的。再判断一个列表对象。
|
|
从返回结果,我们知道,列表[1,2,3]是可迭代的。
当然,并不是要你在使用for循环之前,非要判断某个对象是否可迭代。因为至此,你已经知道了字符串str、列表list、字典dict、元组tuple、集合set都是可迭代的。
zip()
zip()——一个内建函数,Python 2中,参数是seq1, seq2, ...,意思是序列数据;在Python 3中,参数需要时可迭代对象。这点差别,通常是没有什么影响的,因为序列也是可迭代的。值得关注的是返回值,在Python 2中,返回值是一个列表对象,里面以元组为元素;而Python 3中返回的是一个zip对象。
通过实验来理解上面的文档:
|
|
如果序列长度不同,那么就以”the length of the shortest argument sequence”为准。
|
|
|
|
zip是一个内置函数,它的参数必须是序列,如果是字典,那么键视为序列。然后将序列对应的元素依次组成元组,做为一个列表的元素。
问题:有两个列表,分别是:a = [1, 2, 3, 4, 5], b = [9, 8, 7, 6, 5],要计算这两个列表中对应元素的和。
- for循环实现
|
|
- zip()实现
|
|
问题:有一个字典,myinfor = {“name”:”qiwsir”, “site”:”qiwsir.github.io”, “lang”:”python”},将这个字典变换成:infor = {“qiwsir”:”name”, “qiwsir.github.io”:”site”, “python”:”lang”}
- for循环
|
|
- zip()
|
|
enumerate()
enumerate()也是内建函数。
|
|
如果要同时得到元素索引和元素怎么办?
- for循环
|
|
- enumerate
|
|
问题:将字符串中的某些字符替换为其它的字符串。原始字符串”Do you love Canglaoshi? Canglaoshi is a good teacher.”,请将”Canglaoshi”替换为”PHP”.
|
|
列表解析
Python有一个非常强大的功能,就是列表解析,它这样使用:
|
|
|
|
在很多情况下,列表解析的执行效率高,代码简洁明了。是实际写程序中经常被用到的。
现在Python的两个版本,对列表解释上,还是有一点点差别的,请认真看下面的比较操作。
|
|
先i = 1,然后是一个列表解析式,非常巧合的是,列表解析式中也用了变量i。这种情况,在编程中是常常遇到的,我们通常把i=1中的变量i称为处于全局命名空间里面(命名空间,是一个新词汇,暂且用起来,后面会讲述),而列表解析式中的变量i是在列表解析内,称为处在局部命名空间。在Python 3中,for循环里的变量不再与全局命名空间的变量有关联了。
while语句
while
|
|
break
|
|
continue
|
|
while…else
while...else有点类似if ... else,只需要一个例子就可以理解。 当然,一遇到else了,就意味着已经不在while循环内了。
|
|
for…else
除了有while...else外,还可以有for...else。这个循环也通常用在当跳出循环之后要做的事情。
|
|