三目运算
又叫做三元运算,是简单if.....else.....语句的一种替代格式,如:
k = 1 if k == 1: print(True) else: print(False)
如上if....else语句输出结果为True,可以用如下三目运算代替:
k = 1 print(True) if k ==1 else False
可以看到,三目运算就是简单if....else...语句的一种代替
不同数据类型在内存中的存储方式
str类型:
s1 = 'hello' print(id(s1)) print(id(s1.upper()))
输出结果为:
90146656
89414152
s1 = 'hello' print(id(s1)) s2 = s1 print(id(s2))
输出结果为:
79793328
79793328
从以上两个实例不难看出,对于str类型,创建之后,如果再修改,就是相当于在内存中重新创建了一次,但是把一个str的值赋值给另一个变量,这两个变量指向的是同一块内存区域
s = '123' for i in s: print(id(i))
输出结果为:
86225944
90615400
90828512
从该例我们可以看出,str中字符的存储地址在内存中是不连续的
list类型:
li1 = [1,2,3] li2 = li1 print(id(li1)) print(id(li2))
输出结果为:
85447048
85447048
li1 = [1,2,3] print(id(li1)) print(id(li1.append(4)))
输出结果为:
78303624
1376115800
从以上两个实例可以看出,对于list类型,创建之后,如果再修改,就是相当于在内存中重新创建了一次,但是把一个list的值赋值给另一个变量,这两个变量指向的是同一块内存区域
对于字典也有这样的结论,不在另外举例
li = [1,2,3] for i in li: print(id(i))
输出结果为:
83387256
83387232
83387208
从该例可以看出,list类型的数据,其元素如果是数字在内存中是连续存放的,如果是字符,元素的存放并不连续
本想在这里探究一下存储的方式,但是细节太多,兵来将挡,水来土掩吧,用id直接查看他们的地址吧!
深浅拷贝
拷贝也分深浅,从字面意思来看,两种拷贝方式的不同就在于拷贝的程度深浅不一样
浅拷贝:只拷贝最外面一层
深拷贝:除去最内层全部拷贝
在python中有一个copy模块,copy.copy()为浅拷贝,copy.deepcopy()为深拷贝
对于数字和字符串来说,无论是深拷贝还是浅拷贝,id永远都是一样的,只要修改,就需要再创建一个
对于列表、元组、字典等其他来说,浅拷贝只拷贝最外面一层,深拷贝比较彻底,但最后一层(最底层的字符串,数字)不拷贝
列表推导式
列表推导式又叫列表生成式,由名字不难看出,得出的结果是一个列表。
当然生成一个列表也可以有别的一些方法,但是通过列表推导式可以写出很简洁的代码
如:
ret = [x*x for x in range(10)]
print(ret)
输出结果为:[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
在for的后面可以加条件判断,以满足一些特殊的需求,如:
ret = [x*x for x in range(10) if x%2 == 0]
print(ret)
输出结果为:[0, 4, 16, 36, 64]
ret = [m + n for m in 'abc' for n in 'xyz']
print(ret)
输出结果为:['ax', 'ay', 'az', 'bx', 'by', 'bz', 'cx', 'cy', 'cz']
通过上面的例子,因该不难掌握列表推导式