之前讲了python基本数据类型和组合数据类型
is操作符可以判断类型的不太之处
对象有很多标识,当作内存地址,就是唯一标识符
id看l4第0个元素
number1也是同一个元素
虽然是两个不同的变量,但是可以引用一个元素
**is判断是否同一元素
下面的比较是l1和l3是否同一个对象,并不是比较值是否相同 **
但是l1[0]和l3[0]是同一个对象
不是同一个对象,但是可以引用内部的同一个对象,因为123不可变,节约空间可以这么玩
比较l1和l3的值是否一样,对象是不一样的
type l1和l3都是列表
是类型比较
对象比较 使用is,对象类型比较 使用type is,对象值比较使用 ==,
is
引用的比较:
l1 == l2 :对象值的比较
l1 is l2 : 是否为同一个对象
type(l1) is type(l2 ):两个对象的类型是否相同
**python 一个编程语言最基本的组成片段是表达式,组成的语句,表达式通常是一个或多个操作数,0个以上操作符组成的序列
算术表达式,比较表达式 ,赋值表达式
**
表达式操作符:
+,-,*,/
&,|,^ and 或 异或
and,or,not 逻辑与或非
* * 次方,%取模,//真除法,
[i:j:k]步进的
()
x.attr 取属性,指明属性引用
()元组定义
[]列表定义
{}字典定义
表达式有优先级,最后三个优先级最高,然后是切片,
**整个程序是语句+表达式组成,控制流类似bash,选择执行 if ,循环执行 while for **
等值比较和身份判定
按照abcd这样 的次序
先排序,排序后按键值进行比较,有的键i相同就比较值
链接多个条件无非就是与或非
一定要记得缩进4个字符,同一级别下,缩进字符必须相同
l1和l2的确相同
如果不小心缩进字符有问题,就会报错 indentationerror缩进语法错误
这就是if语句
if语句的基本语法结构
if boolexpr1: 双分支
suite1
else
suite2
if boolexpr1: 单分支
suite1
if boolexpr1: 双分支
suite1
elif
suite2
。。。
else:
suiten
还有三元表达式
expression1 if boolexpr else expression2
如果条件为真执行 expression1 否则 执行 expression2
for经常遍历字符串,元组列表,以及其他任何内置可迭代对象
隐性迭代
else只是在循环中止,条件测试为假时,执行一次,用于做收尾工作
else之后的语句在循环退出了才执行,
如果从来没循环呢
while也支持这么几个独特的语句
只有条件满足时才break,或者continue
如果是break,else是不会执行的,有语法错误,else也不会执行
iterable表示可以迭代对象,通过遍历完成循环
这个列表有4个元组组成,循环的时候
a=1,b=2循环一次a=3,b=4
每一个序列都是一个可迭代对象
list强行把字符串转换成列表元素
python2是两个内置函数,python3是一个,统一到range上,与bash的{1…10}类似
表示从0开头
help range的用法
支持跟一个数值
也支持从哪开始,到哪结束,三个数值,表示步长
100以内的奇数
在python3是一个个给你,节省内存
在python2不是,range是一次给所有列表
xrange才是一次只给一个结果
zip就是拉链,把两个不相关的内容结合在一起
并行遍历
iterable(任何对象)能判定,一次返回一个成员对象,这种称为可迭代对象(对象自己实现了__iter__方法)
所有的序列都可迭代(list,str,tuple元组),
iter和getitem方法酒标它是一个可迭代对象
显示了一个列表中可迭代器的一个对象的地址’
不一样是因为,第一个元素的地址,第二个元素的地址
**这是基于元素地址的方式来实现的
getitem和iter都是一次迭代一个
s是可迭代对象
a就不是
**
游标可以想象成有多个元素,文件有多行,当我们引用这个文件的行时,第一次没定义话的,就指向第一个,依次往下,游动的指针,游动的标记
迭代器又称游标,它是一种可在容器物件(列表就是容器物件)上实现元素遍历的接口、
所以迭代器指的是你的容器物件之上的游标,支持游标机制的称为可迭代对象
迭代协议就是一次返回一个,不想那么复杂
任何对象使用iter方法可以生成一个迭代器,变量可以引用这个地址的对象
myiter就是一个可迭代对象,调用myiter的next的方法,一次可以返回一个值,以知道最后异常中止
直接写l1.__next不行,因为只是一个可迭代对象,不是迭代器,就需要赋值给变量,来迭代,其中包含__next
在python2不要下划线
for循环隐含了一个迭代对象帮你生成一个迭代器的
根据一个表达式生成一个列表,叫列表解析
比如生成一个100以内所有偶数生成的列表
可以把这个表达式直接放在中括号里,不加print和for,会自动给你生成一个列表
0-8的每个平方所构成的列表
用一个表达式来生成列表的操作叫列表解析
本身就是一个可迭代对象,遍历所有元素之后所生成的结果
1到11的,求立方
列表解析还可以加if语句,只有符合条件的才能进入元素
求100以内的奇数可以这么写,只有符合条件的才能进入列表解析中去,否则不予进入
**如果只想一次用一个,可以定义生成器而不是迭代器,迭代器基于列表解析生成的结果是整个列表,它将始终放在内存中,如果一次只使用一个,生成器就是一次只生成一个,这样就比较节省内存,
所以生成器并不真正创建列表,而是返回一个生成器对象,而后一次做一次生成,就跟迭代器的next方法一样,next方法是一次只取一个而已,对象是在的
**
生成器是放在小括号里的,会返回一个生成器对象
生成了一个对象,就是要加.点