人生苦短,我爱python
〇、Python的代码块和缩进规则
先讲这一部分是因为后面的分支和循环必须进行恰当的缩进。
代码块是作为一个单元执行的代码文本,对程序的结构和执行有重要影响,退出代码区块范围就退出了作用域范围。
在C/C++中,用大括号来标识代码块,Python中,用缩进来标识代码块。
在任何编辑器中,Python可以按tab键来进行缩进,一般为4个空格,只有位于同一缩进水平的代码会作为同一代码块执行,Python不允许胡乱缩进,否则会有语法错误。
一、python的分支语句
分支即为遇到了岔路,复杂程序大概率不会一条路顺着执行,就需要根据不同的条件进入不同的分支。
Python的分支语句只有三个关键字,if、else、elif。
1. 单分支语句
if和条件之间要空格,条件之后要加冒号(:),下面表达式可以是一句,也可以是多句,但一定要注意正确缩进。
if <条件>:
表达式
例如:
if grade < 60:
GPA = 0
2. 两分支语句
else后面要加冒号(:),每个表达式都是一个代码块,注意正确缩进。
if <条件>:
表达式
else:
表达式
if num == 1:
gender = 'male'
else:
gender = 'female'
另一种格式的if-else语句(实质上相当于三目运算符),还是举个例子来说明:
PASS = True if grade >= 60 else False
总结一下是
值1 if 条件 else 值2
3. 多分支语句
else后面要加冒号(:),每个表达式都是一个代码块,注意正确缩进。
if <条件>:
表达式
elif <条件>:
表达式
elif <条件>:
表达式
……
else:
表达式
if chnum == '一':
num = 1
elif chnum == '二':
num = 2
elif chnum == '三':
num = 3
else:
num = 0
二、Python的循环语句
1. while循环
while循环比较简单,语法为:
while <条件>:
表达式
写个求前n个自然数之和的例子吧
sum = 0
i = 0
n = int(input())
while i < n:
sum += i
i += 1 #注意python没有++操作
2. for循环
for循环依赖于可迭代对象,在基本数据类型中,string、list、tuple、set、dict均为可迭代对象。
举个例子:
fruits = ['apple','banana','orange']
for f in fruits:
print(f)
apple
banana
orange
string = "python"
for s in string:
print(s,end=',')
p,y,t,h,o,n,
range对象
可迭代对象还有什么呢?这里暂且介绍一种常用的特殊可迭代对象:range。
range可以用于创建一个整数列表,可以有三个参数,分别为:start, stop, step,常常用在for循环中。
start:起始范围,默认为从0开始,例如range(3)包括0,1,2。
stop:终止范围,但不包括stop本身,例如range(0,5)包括从0到4的整数。
step:步长,默认为1,可以指定为非0整数(负数是允许的)。
从range可以用list转为列表,例如:
>>> r = range(0,10,2)
>>> list(r)
[0, 2, 4, 6, 8]
>>> list(range(10,0,-1))
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
在for循环中,常常用range来代替列表的索引,通过索引来获取列表元素,这种方式看起来更像C语言。
fruits = ['apple','banana','orange']
for i in range(len(fruits)):
print(fruits[i])
apple
banana
orange
enumerate函数
既然我们既可以直接对序列对象进行迭代,也可以获取其索引迭代,有没有可以同时获取到索引和其值的循环迭代法呢?当然是有的。
enumerate函数可以返回一个带有索引和值的可迭代对象,举个例子来说明其作用。
fruits = ['apple','banana','orange']
for i,value in enumerate(fruits):
print(i,value)
0 apple
1 banana
2 orange
在for循环中修改对象
首先试一下可否通过第一种直接迭代的方式修改对象。
我们假设一个场景,要把一个数组的每一个元素都变成原来的平方。
array = list(range(0,5))
for a in array:
print("old:",id(a))
a *= a
print("new:",id(a))
print(array)
old: 2069324960
new: 2069324960
old: 2069324976
new: 2069324976
old: 2069324992
new: 2069325024
old: 2069325008
new: 2069325104
old: 2069325024
new: 2069325216
[0, 1, 2, 3, 4]
最后发现这个array是没有改变的,究其原因,是循环迭代中的a,虽然代表了真实的数组中元素的地址,但一旦对其赋值,地址就会改变,所以新的值没有写入到数组中。
但如果是通过索引去赋值,猜测是改变值的同时,列表等复杂对象同时会改变记录的地址,从而将新的值放入到列表中,因此一定要通过索引的方式才可以改变列表等复杂序列对象的值。
所以正确的写法为:
array = list(range(0,5))
for i in range(len(array)):
array[i] *= array[i]
print(array)
[0, 1, 4, 9, 16]
3.循环控制:break,continue,return
break的作用是跳出当前循环,一般用于符合一定条件时提前退出循环。
continue的作用是跳过当前这次循环,直接进入下一次循环。
return的作用是退出当前函数,在Python中如果在一个函数外使用这一关键字会报错。
4. 列表生成式
Python中存在一种比较简单的生成列表的方法,是结合了List类型和for循环的语法,叫做列表生成式。来看个例子。
我们要生成2的从1到10次幂组成的列表,一种方式为:
twopowlist = []
for i in range(1,11):
twopowlist.append(2**i)
另一种方式为:
twopowlist = [ 2**i for i in range(1,11) ]
在实际运行中,第二种方式不但语法简洁,运行速度也明显快于第一种。
学会这一讲的知识后,各位应该可以写任意复杂逻辑的python语句了,下一讲函数和对象可以让我们的Python语句看起来更简单,敬请期待!!!