自学Python-语句(3)

循环语句

简单的for循环

for循环的语法和if差不多,条件需要冒号,语句块需要四个空格的缩进:

1
2
3
hello = "world"
for i in hello:
print i, #输出:w o r l d

这个for循环是怎么工作的呢?

  1. hello这个变量引用的是”world”这个str类型的数据
  2. 变量 i 通过hello找到它所引用的对象”world”,因为str类型的数据属于序列类型,能够进行索引,于是就按照索引顺序,从第一字符开始,依次获得该字符的引用。
  3. 当 i=”w”的时候,执行print i,打印出了字母w,结束之后循环第二次,让 i=”e”,然后执行print i,打印出字母e,如此循环下去,一直到最后一个字符被打印出来,循环自动结束。

因为可以也通过使用索引(偏移量),得到序列对象的某个元素。所以,还可以通过下面的循环方式实现同样效果:

1
2
3
hello = "world"
for i in range(len(a)):
print a[i], #输出:w o r l d

其工作方式是:

  1. len(a)得到hello引用的字符串的长度,为5
  2. range(len(hello),就是range(5),也就是[0, 1, 2, 3, 4],对应这”world”每个字母索引,也可以称之为偏移量。这里应用了一个新的函数range(),关于它的用法,继续阅读,就能看到了。
  3. for i in range(len(hello)),就相当于for i in [0,1,2,3,4],让i依次等于list中的各个值。当i=0时,打印hello[0],也就是第一个字符。然后顺序循环下去,直到最后一个i=4为止。
  • 这种语法由于我也第一次接触,所以直接用的 《零基础自学python》的原文

while

while比较简单就不多说了,可以通过下面的例子来了解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
import random

number = random.randint(1,101)

guess = 0

while True:

num_input = raw_input("please input one integer that is in 1 to 100:")
guess += 1

if not num_input.isdigit():
print "Please input interger."
elif int(num_input) < 0 or int(num_input) >= 100:
print "The number should be in 1 to 100."
else:
if number == int(num_input):
print "OK, you are good.It is only %d, then you successed." % guess
break
elif number > int(num_input):
print "your number is more less."
elif number < int(num_input):
print "your number is bigger."
else:
print "There is something bad, I will not work"

这个例子是直接抄的原文的,通过这个例子应该对while有了大概的了解:

  • 只要条件成立就一直运行。
  • 遇到break,就直接跳出循环。
  • 遇到continue,就从头开始执行。

内建函数range(start,stop[, step])

一般形式是range(start, stop[, step])

关于range()函数有以下主要注意的地方:

  1. 这个函数可以创建一个数字元素组成的列表。
  2. 这个函数最常用于for循环。
  3. 函数的参数必须是整数,默认从0开始。返回值是类似[start, start + step, start + 2*step, …]的列表。
  4. step默认值是1。如果不写,就是按照此值。
  5. 如果step是正数,返回list的最最后的值不包含stop值,即start+istep这个值小于stop;如果step是负数,start+istep的值大于stop。
  6. step不能等于零,如果等于零,就报错。

参数的含义:

  • start:开始数值,默认为0,也就是如果不写这项,就是认为start=0
  • stop:结束的数值,必须要写的。
  • step:变化的步长,默认是1,也就是不写,就是认为步长为1。坚决不能为0
1
2
3
4
5
print range(9)
print range(0,9)
print range(0,9,1) #前三个输出一样含义一样
print range(1,9,1) #开始数值从1开始
print range(0,9,2) #步长为2,也就是输出0,2,4,6,8

如果结束值是负值,那么步进也需要是负值:

1
print range(0,-9,-1)

掌握了range()函数以后,我们可以写一个例程:

  • 求100以内能被3整除的正整数
    1
    2
    #以第一个能被3整除的数开始,步进为3就可以很快的得到
    range(3,100,3)

能够用来for的对象

所有的序列类型对象,都能够用for来循环。比如

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
name_str = "carl"   #str
for i in name_str:
print i,

name_list = list(name_str) #list
for i in name_list:
print i,

name_set = set(name_str) #set
for i in name_set:
print i,

name_tuple = tuple(name_str) #tuple
for i in name_tuple:
print i,

name_dic = {"name":"carl","age":22} #dict
for i in name_str:
print i,name_dic[i],
  • 值得注意的是字典获取的是key的值

并行迭代

计算两个列表a = [1,2,3,4,5], b = [9,8,7,6,5]的和,这就是并行迭代

我们可以这么做:

1
2
3
4
5
6
a = [1,2,3,4,5]
b = [9,8,7,6,5]
c = []
for i in range(len(a)):
c.append(a[i] + b[i])
print c

python有更好的方法实现这一功能,这就是zip()函数


zip()

函数原型是:

  • zip(seq1 [, seq2 […]])

seq1, seq2分别代表了序列类型的数据,我们可以试一下这个函数

1
2
3
4
a = "carl"
b = "name"
print zip(a,b)
#输出:[('c', 'n'), ('a', 'a'), ('r', 'm'), ('l', 'e')]

如果两个序列长度不同则以最短的为准

1
2
3
4
a = [1,2,3,4,5]
b = [1,2,3]
print zip(a,b)
#输出:[(1, 1), (2, 2), (3, 3)]

如果参数只有一个序列是会是以下的样子

1
2
3
a = [1,2,3,4,5]
print zip(a)
#输出:[(1,), (2,), (3,), (4,), (5,)]

让我们用zip()来解决最开始的问题

  • 计算两个列表a = [1,2,3,4,5], b = [9,8,7,6,5]的和
    1
    2
    3
    4
    5
    6
    a = [1,2,3,4,5]
    b = [9,8,7,6,5]
    c = []
    for x,y in zip(a,b):
    c.append(x+y)
    print c

list解析

先看下面的例子,这个例子是想得到1到9的每个整数的平方,并且将结果放在list中打印出来

1
2
3
4
a = []
for i in range(1,10):
a.append(i*i)
print a

python其实还可以这么做

1
2
a = [i**2 for i in range(1,10)]
print a

在高级一点去除列表中字符串的前后空格

1
2
3
mybag = [' glass',' apple','green leaf ']
mybag = [i.strip() for i in mybag]
print mybag

自学Python-语句(3)
https://carl-5535.github.io/2020/11/10/自学python/自学Python-语句-3/
作者
Carl Chen
发布于
2020年11月10日
许可协议