Python3学习笔记(2)——特性和语句

1    特性

1.1   切片操作

可以对列表、字符串、元组等序列类型操作

list1=[1,2,3];a=list1[:2];a[0]=2 #list1 由于列表元素是不可变的数值类型,所以改变数据时,显式的创建了新的数据,因此改变a,list1不受影响(但是对于numpy的array类型,切片只是原数组的视图,任何改变都会反映到原数组,应该用.copy()方法复制一份)

从0开始计数

list1=[1,2,3,4,5]list1[:3] #[1,2,3]不包含索引为3(即元素4)

最后一个元素 list1[-1]

最后十个元素 list1[-10:]

步长 list1[::-1]翻转

1.2   迭代器

1.2.1   迭代器(Iterator)

是一个实现了__next__()方法的对象。迭代器同时也是可迭代对象。而不是通过索引来计数。不能向后移动,不能回到开始,也不能被复制。

*注:Iterator实现的__iter__是为了兼容Iterable的接口,从而让Iterator成为Iterable的一种实现。

Iterator也是一种Iterable,所以也需要实现Iterable的接口,也就是__iter__,这样在for当中两者都可以使用。Iterator的__iter__只需要返回自己就行了。比如for i in list1: 和for i in iter(list1):都对。

list、dict等对象可以重复和并发遍历,通过__iter__每次返回一个独立的迭代器,可以保证不同的迭代过程不互相影响。而生成器表达式的结果往往是一次性的,不可以重复遍历,所以直接返回一个Iterator就好。让Iterator也实现Iterable的兼容就可以很灵活地选择返回哪一种。

1.2.2   可迭代对象(lterable)

可以直接作用于for循环的对象统称为可迭代对象。是实现了__iter__()方法的对象,可以被迭代。

一类是集合数据类型,如list、tuple、dict、set、str等,一类是generator,包括生成器表达式和带yield的generatorfunction返回的生成器对象。

可以调用iter()函数,返回一个迭代器。

    可以使用如下语句判断一个对象xx是否是Iterable对象。

from collectionsimport Iterable

isinstance(xx,Iterable)

内建函数iter(): 调用对象的__iter__()方法。例如 i=iter([1,2,3,4]);i.next()  #

字典:字典的迭代器会迭代它的键。iter(dict1) # 会返回键的迭代器

文件:for循环可以自动调用文件对象的readline() 方法.

for eachLine in myFile:

*不要在迭代可变对象的时候修改它们。比如遍历列表时删除满足条件的项。而迭代器是与原始对象捆绑在一起,语法上禁止迭代中改变对象长度。

1.2.3   相关模块:itertools

1.3   列表解析

迭代 iterable 对象的所有条目. 前边的expr应用于序列的每个成员, 最后的结果值是该表达式产生的列表.con_exdr是筛选或过滤条件

[expr for iter_val in iterable]

[expr for iter_val in iterable ifcond_expr]

[x**2 for x in range(8) if not x % 2]

迭代二维对象,相当于循环嵌套:

[expr for iter_val1 in iterable1 ifcond_expr2 for iter_val2 in iterable2 ifcond_expr2]

[(x+1,y+1) for x in range(3) for y inrange(5)] 

len([word for line in myFile for wordin line.split()])#迭代每个单词

1.4   生成器(generator)

1.4.1   生成器表达式

与列表解析式相似,但是不生成整个列表,而是每次计算出一个条目,就把它yield出来,内存上更有效。

 (expr for iter_var in iterable if cond_expr)

例1:计算文本中非空白字符总和

sum(len(word) for line in data for wordin line.split())#每计算出一个len(word)就传给sum()

1.4.2   生成器

生成器实现了__next__()方法,因此本身是一个迭代器,同时也是可迭代对象。它是一个带yield 语句的函数, 生成器能暂停执行并返回一个中间的结果.

生成器函数的默认返回值是一个生成器。调用生成器函数将返回一个生成器:val1=gen()

当到达函数结束或return,(当调用next()),抛出StopIteration异常。

def foo():

    print(1)

    yield ('yield:1')

    print(2)

    yield ('yield:2')

return 'done'

o=foo()

next(o)

next(o)

next(o)

#必须用变量调用生成器函数,才能获得一个生成器

#或者o.__next__(), 返回1   yield:1

#返回2   yield:2

# 返回异常StopIteration: done

.send()函数:在生成器函数中,将yield变成一个表达式,使其有一个值n = (yield n),这个值就是外部调用send(val)时传进来的参数,可供生成器下一次使用。

.close()函数:用于关闭生成器。

1.4.3   相关模块:pipe

2    语句

2.1   语句基础

换行:跨行符: \ 语句分行;    三引号:''' 字符串跨行;    括号元素:() {} []等

同一行写多个语句:用分号 ;(不提倡)

2.2   成员关系操作(in, not in)

可以对列表、字符串、元组、字典(查询的是键)类型操作,返回bool逻辑值

2.3   三元操作符

val1=1 if x==1 else 2 #如果x==1,则val1=1,否则val1=2

2.4   for循环

for循环访问一个可迭代对象,序列、迭代器。

2.4.1   迭代序列

①通过序列项迭代:for item in seq1:

②通过索引:     for index in range(len(seq1)):

③使用项和索引:  for index,item in enumerate(seq1):

2.4.2   用于迭代器类型

迭代器对象有一个next()方法, 调用后返回下一个条目. 所有条目迭代完后,自动地调用迭代器的next()方法, 捕获 StopIteration 异常并结束循环。

2.4.3   range函数

range() 函数返回的是一个可迭代对象,不是整个列表(可以用list())。

range(start, end, step =1)

生成k,start <= k < end,以step步长

range(end)

返回[0,end)的可迭代对象

2.5   continue

在开始下一次迭代前,如果是条件循环,将验证条件表达式.如果是迭代循环,将验证是否还有元素可以迭代. 只有在验证成功的情况下, 才会开始下一次迭代.

2.6   循环中的else

循环执行完毕正常退出(而不是通过break退出),执行else中的内容。

while xxx:

    [codes]

else:

    [codes]

for i in XXX:

[codes]

else:

[codes]

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值