条件和循环

Python 核心编程[第八章]

0x00 条件

下边多个 x 表示某个执行语句,单个 x 表示某种条件或某种类型的变量。

一、if 语句

由三部分组成:关键字、条件表达式、执行代码块

1.多重表达式
### 优先级:not > and > or
  if x and x:
	  xxxxxxx
2.单一语句代码块
  if x:
	  xxxxx

二、else 语句

1.语法
  if x:
	  xxxxx
  else:
	  xxxxx
2.避免悬挂 else

  Python 用缩进强制代码对其,让程序员决定 else 属于哪一个 if。

3. else 语句的特殊用法

  在 Python 中 else 可以在 while 循环和 for 循环中使用,在循环中使用时, else 子句只在循环完成后执行,也就是说 break 语句也会跳过 else 块。所以只要循环正常结束 else 语句就会正常执行。

三、elif 语句

  if x:
	  xxxx
  elif x:
	  xxxxx
  else:
	  xxxxxx

四、条件表达式

  x if c else y  <=> C: c ? x:y

0x01 循环

一、while 语句

1.一般语法
  while x:
	  xxxxxxx
2.计数循环
while(x<num):
	xxxxxxxxx
3.无限循环
while True:
	xxxxxxxx

二、for 语句

它可以遍历序列成员,可以在列表解析和生成器表达式中,它会自动地调用迭代器的 next() 方法,捕获 StopIteration 异常并结束循环。

1.一般语法
  for i in x:
  	xxxxx
2.用于序列类型

(1)通过序列项迭代:

  for i in x:
  	xxxxxxxxx

(2)通过序列索引迭代:

  for i in range(len(x)):
  	xxxxxxxxxx

(3)用于项和索引迭代

  ##  其中 i 表示第几个 y 表示是什么
  for i,y in enumerate(x):
  	xxxxxx	
3.用于迭代器类型

  用 for 循环访问迭代器和访问序列的方法差不多,唯一的区别就是 for 语句会为你做一些额外的事情。迭代器并不代表循环条目的集合。迭代器对象有一个 next() 方法,调用后返回下一个条目。所有条目迭代完后,迭代器引发一个 SyopIteration 异常告诉程序循环结束。for 语句在内部调用 next() 并捕获异常。使用迭代器做 for 循环的代码与使用序列条目几乎完全相同。事实上在大多数情况下,你无法分辨出你迭代的是一个序列还是迭代器,这就是为什么说要遍历一个迭代器时,实际上可能我们指的是要遍历一个序列、迭代器、或是一个支持迭代的对象。

4.range() 与 xrange()

  range(start,end,step) pyhon 2 中它会生成一个列表,python 3 中它会生成一个可迭代对象 range,在python 2 中 xrange() 与 python3 中的 range() 相似甚至相同,python3 中没有 xrange() 函数

5.与序列相关的内建函数
  • sorted():返回一个序列
  • zip():返回一个序列
  • reversed():返回迭代器
  • enumerate():返回迭代器

三、break 和 continue 语句

1.break 语句

  类似 C 中的传统 break 语句,需要立即从循环(while 、for)退出时用 break 语句。

2.continue 语句

  当遇到 continue 语句时,程序会终止当前循环,并忽略剩余语句,然后回到循环的顶端。可以用于 while 循环(条件性的循环)和 for 循环(迭代性的循环),不过在开始下一次循环之前,程序会先判断是否符合循环条件。

0x02 其他

一、迭代器和 iter() 函数

1.迭代器是?

  它为类序列对象提供了一个序列接口,他们是一组数据结构,可以利用索引从 0 开始迭代到序列最后一个条目。Python 的迭代无缝地支持序列对象,而且允许序程序员迭代非序列类型,包括用户自定义对象。可以迭代不是序列但表现出序列类型地对象,如字典的键,文件的行,当你使用循环迭代一个对象条目时,你几乎分辨不出它是迭代器还是序列

2.如何迭代

  从根本上说,迭代器就是一个有 next() 方法的对象,而不是通过索引来计数。调用 next() 方法获取全部条目,之后会引发 StopIteration 异常告诉外部调用者,迭代完成。不过迭代器有一些限制,例如,你不能向后移动,不能回到开始,不能复制一个迭代器,如果你要在此迭代同一个对象,你只能去创建另一个迭代器对象。
  reversed() 内建函数会返回一个反序访问的迭代器。enumerate() 内建函数也返回一个迭代器。any() 和 all() 内建函数是如果某个或所有条目的值为真时,它们返回为真。iter(x),将 x 变为迭代器形式。

3.如何使用迭代器

(1)序列:

  for i in x:  ## x 为一个序列
  	xxxxx
  ## 实际工作方式
  f = iter(x)
  while True:
  	try:
  		i = f.next()
  	except StopIteration:
  		break
  	xxxxx  	

(2)字典:

  for i in x:   ## x 为一个字典 i 为键
  	xxx
  
  ## 例
  dic1 = {(1,2):(3,4,5)}
  for i in dic1:
  	print("%s %s" %i )
  	print("%s %s %s "%dic1[i])
  	## ditc1.iterketys()  通过键迭代
  	## dict1.itervalues()  通过值迭代
  	## dict1.iteritems()  通过键-值迭代

(3)文件

  x = open('',)
  for i in x:
  	xxxxxx
4.如何创建迭代器
  • iter(obj):
  • iter(obj,sentinel):一直迭代到下一个值为 sentinel

二、列表解析

1.解析列表语法
  [expr for iter_var in iterable]
  ## 通过 for 循环,迭代 iterable 对象的所有条目。
  ## 前边的 expr 应用于序列的每一个成员,最后的结果是该表达式产生的列表。
  ## 迭代变量并不需要表达式的一部分。
2.解析列表的扩展用法
  [expr for iner_var in iterable if cond_expr]
  ## 这个语法在迭代时会过滤或"捕获"满足条件表达式的 cond_expr 成员。
3.矩阵样例
  ## 3 行 5 列
  [(x+1,y+1) for x in range(3) for y in range(5)]
4.其他
  [x for a in b for x in a]
  ## 生成 x 列表,从 b 中选出 a 后再从 a 中选出 x

三、生成器

生成器是列表解析的一个扩展,它是特定的函数,允许它返回一个值,然后"暂停"代码的执行,稍后恢复。列表解析的一个不足就是必须要生成所有数据,用以创建整个列表。这可能对有大量数据的迭代器有负面效用。生成器表达式通过结合列表解析和生成器解决了这个问题。生成器表达式和列表解析非常相似,不过它不真正创建列表,而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目"产生"出来。生成器表达式使用了"延迟计算",所以它在使用内存上更有效。也就是说生成器是一步一步完成解析列表所完成的任务,所以在处理效率上可能会比较高,所以处理大型数据推荐使用生成器而不是解析列表。

1.生成器表达式
  (expr for iter_var in iterable)

// 看11章进行完善

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值