python自学之《21天学通Python》——for循环基础

4.2.1for基础

Python语言中的for语句与其他高级程序设计语言有很大的不同,其他高级语言for语句要用循环控制变量来控制循环。Python中for语句是通过循环遍历某一序列对象(如第3章所述的元组、列表、字典等)来构建循环,循环结束的条件就是对象被遍历完成。

>>> for i in [1,2,3,4,5]:
...     print(i)
...     if i==2:
...         continue
...     print(i*i)
...     if i==4:
...         break
... else:
...     print('over!')
... 
1
1
2
3
9
4
16
>>> 

在这里插入图片描述在这里插入图片描述

>>> adct = {'apple':15,'banana':20,'pear':35}
>>> for key,value in adct.items():
...     print(key,':',value)
... 
apple : 15
banana : 20
pear : 35
>>> 

>>> for key in adct.keys():
...     print(key)
... 
apple
banana
pear
>>> 

>>> for value in adct.values():
...     print(value)
... 
15
20
35
>>> 

4.2.3for语句与range()函数
for语句中的对象集合可以是列表、字典以及元组等,也可以通过range()函数产生一个整数列表,以完成计数循环。range()函数的原型如下:
range( [start,] stop[, step])
其参数含义如下:
start 可选参数,起始数,默认值为0;
stop 终止数,如果range只有一个参数x,那么range生产一个从0至x-1的整数列表;
step 可选参数,步长,即每次循环序列增长值。
注意:产生的整数序列的最大值为stop-l。
for语句使用range()函数可以构建基于已知循环次数的循环程序,也可以以range()生成的数字作为索引来访问列表、元组、字符串中的值,还可以对遍历的序列实行处理,以得到相关的数据。
注意:range()函数并不是在调用时一次生成整个序列,而是遍历一次才产生一个值,以减少内存的占用,其本质是一个迭代器(本书稍后会介绍)。
在这里插入图片描述
【代码说明】代码中首先使用输入函数获取用户指定的序列开始和结束,然后用for语句构建了两层嵌套的循环语句用来求素数并输出。外循环用来产生要判素数的序列,内循环用来产生测试的因子。
注意:代码中的else子句的缩进表示它属于内嵌的for语句。如果多缩进一个单位,则属于其中的if语句;如果少缩进一个单位,则属于外层for语句。因此,Python中缩进是程序很重要的构成部分。

4.2.4 for语句与内置迭代函数
Python语言内置了几种常用的迭代函数,既方便又实用。
enumerate (seq ) #编号迭代
sorted (seq) #排序迭代
reversed (seq)#翻转迭代
zip (seql,seq2,…)#并行迭代
编号迭代在迭代时既返回序列中的元素,又返回该元素在序列中的编号(编号从0开始)。for语句进行编号迭代时,应使用两个循环变量分别接收编号和元素的值。

>>> for i,item in enumerate('abcd'):
...     print('第%d个字符:%s' % (i,item))
...0个字符:a
第1个字符:b
第2个字符:c
第3个字符:d
>>> 

排序迭代的作用是使得在for的遍历时先遍历序列中较小的值,后遍历序列中较大的值,当然这要求序列中的数据可以是排序的同类数据。而翻转迭代就是将迭代序列中的元素从尾至头进行遍历。并行迭代也是一种很实用的迭代函数,它在遍历时是同时遍历函数中给出的seql、seq2等序列中同一序号的元素。

>>> lsta=(1,2)
>>> lstb=(3,4)
>>> lstc=(5,6,7)
>>> for i,j,k in zip(lsta,lstb,lstc):
...     print('%d:%d:%d' % (i,,j,k))
  File "<stdin>", line 2
    print('%d:%d:%d' % (i,,j,k))
                          ^
SyntaxError: invalid syntax
>>> for i,j,k in zip(lsta,lstb,lstc):
...     print('%d:%d:%d' % (i,j,k))
... 
1:3:5
2:4:6
>>> 

注意:并行迭代函数中序列值的长度不一致时,只遍历到最短的序列的长度。
(1)与for循环不同的是,while语句只有在测试条件为假时才会停止。在while语句的循环体中一定要包含改变测试条件的语句,以保证循环能够结束,以避免死循环的出现。
(2)while语句包含与if语句相同的条件测试语句,如果条件为真就执行循环体;如果条件为假,则终止循环。while语句也有一个可选的else语句块,它的作用与for循环中的else语句块一样,当while循环不是由break语句终止的话,则会执行else语句块中的语句。而continue语句也可以用于while循环中,其作用是跳过continue后的语句,提前进入下一个循环。

Python中提供的增量赋值运算符很多,基本的运算符都有对应的增量赋值运算符:
+、-、*、/、//、**、%、&、|、^、>>、<< 注意:增量运算符并不是赋值的结果比原来的值大。
增量运算符可以运用在任意使用普通赋值的地方,但是要求增量赋值的参与赋值和运算的操作数能够适用相应的基础运算符。在while语句中,用来增量运算符修改循环控制变量的值非常方便。比如本书实例4-11中的while循环体里的“x=x+1”可写为“x±1”,而“x=‘abc’;x+=3”则会出现语法错误,因为字符串和整数是不能执行加法的。(???)

4.4.1推导基础
comprehension英文本义为理解或内涵(逻辑学用语),那么在Python中是指以紧凑的方式对列表、元组、字典等序列或一系列的元素进行处理,处理结果仍然被放到一个列表、字典等序列之中的语法形式。
典型的列表推导基本形式如下:
[<i 相关表达式> for i in aiterator] aiterator是指一个可遍历的对象,比如列表、元组,也可以是range()函数。其语义为:用循环变量i去遍历aiterator,并且将i相关表达式的值放入一个列表中。每当对列表、元组、字典序列中的元素进行处理时,你都应该尝试使用列表推导来完成,这样非常有助于降低程序的复杂性,即使得程序清晰易懂,缩短了程序的长度。


>>> square=[]
>>> for i in range(1,11):
...     square.append(i*i)
... 
>>> square
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> square1=[i**i for i in range(1,11)]
>>> square1
[1, 4, 27, 256, 3125, 46656, 823543, 16777216, 387420489, 10000000000]
>>> square2=[i*i for i in range(1,11)]
>>> square2
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
>>> 

字典也是可以实现其推导式语法的,其基本格式如下:
{key_exp:value_exp for key_exp,value_exp in aiterator}

>>> keys=['name','age','weight']
>>> values=['Bob','23','68']
>>> {k:v for k,v in zip(keys,values)}
{'name': 'Bob', 'age': '23', 'weight': '68'}
>>> adct={k:v for k,v in zip(keys,values)}
>>> adct
{'name': 'Bob', 'age': '23', 'weight': '68'}
>>> 

列表推导式和字典推导式不仅可以对遍历的元素进行全部处理,还可以使用if语句实现有选择地处理遍历序列中的元素。其基本形式如下:
[<i 相关表达式> for i in aiterator if <条件>]
{key_exp:value_exp for key_exp,value_exp in aiterator if<条件>}

如果要获得一个1~10中所有数的平方,且平方值为偶数的一个列表,就可以使用如下代码来实现:

>>> square_odd=[i*i for i in range(1,11) if i*i%2==1]
>>> square_odd
[1, 9, 25, 49, 81]
>>> 

对于字典推导式也可以使用if来进行部分元素的处理。如果在推导式中的求值表达式或条件表达式中应用函数,则可以构造更加复杂的推导式来实现对序列中的数据进行批量的处理(这也常被称为声明式编程)。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值