is 用于判断两个变量引用对象是否为同一个, == 用于判断引用变量的值是否相等。类似于Java中的equal()和==
//表示整数除
反斜杠
# 错误写法
# print '\'
# 正确写法
print('\\') # \
# 原生字符串
print(r'\\') # \\
# 这是种错误的写法,即使使用原生字符串,也不能以奇数个反斜杠结尾
# print(r'asdf\')
# 解决办法,将他们分开就行
dir = r"\this\is\my\dos\dir"+"\\"
print(dir)
编码
Python3.X 源码文件默认使用UTF-8编码,所以可以正常解析中文,这里顺便提一句,UTF-8是Unicode的一种实现,Unicode只是规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100,1110,0010,0101),它是4个bit为基本单位,也可以说这个符号的表示至少需要2个字节。
在 Python 里,标识符由字母、数字、下划线组成,但不能以数字开头。
以下划线开头的标识符是有特殊意义的:
- 以单下划线开头,如 _ foo 代表不能直接访问的类属性,需通过类提供的接口进行访问,不能用 from xxx import * 而导入;
- 以双下划线开头的 _ _ foo 代表类的私有成员;
- 以双下划线开头和结尾的 _ _ foo _ _ 代表 Python 里特殊方法专用的标识,如 _ _ init _ _() 代表类的构造函数。我们在后面的面向对象会细说
在Python中我们都知道单引号和双引号都可以用来表示一个字符串,比如
str1 = 'python'
str2 = "python"
str3 = 'I\'m a big fan of Python.'
可以注意到,原来的字符串中有一个',而Python又允许使用单引号' '来表示字符串,所以字符串中间的'必须用转义字符\才可以。为了避免使用转义符,可以使用单双引号的混合来定义字符串
str4_ = "We all know that 'A' and 'B' are two capital letters."
str5 = 'The teacher said: "Practice makes perfect" is a very famous proverb.'
三引号有两个用处:
- 当我想要表达如下,很长的式子的时候,我们可以使用三引号
str1 = "List of name:\
Hua Li\
Chao Deng"
str2 = """List of name:
Hua Li
Chao Deng
"""
- 而且使用3个引号还有一个特别的作用就是:加注释!
ASCii码和字符串
# 用户输入字符
c = input("请输入一个字符: ")
# 用户输入ASCII码,并将输入的数字转为整型
a = int(input("请输入一个ASCII码: "))
print( c + " 的ASCII 码为", ord(c))
print( a , " 对应的字符为", chr(a))
打印a到z
li=[chr(i) for i in range(ord("A"),ord("Z")+1)]
List
创建list只要把逗号分隔的不同的数据项使用方括号 [ ] 括起来即可,下标(角标,索引)从0开始,最后一个元素的下标可以写 -1,如
list = ['1','2',‘3’]
list = [] 空列表
添加和删除
list.append() #在末尾增加一个元素
list.insert(n,'4') #在指定位置添加元素,如果指定的下标不存在,那么就是在末尾添加
list1.extend(list2) #合并两个list1,list2
list.pop() #删最后一个元素
list.pop(n) #删除指定的下标元素,如果删除一个不存在的元素会报错
list.reverse() #将列表反转
list.remove(xx) #删除list 里面的一个元素,有多个相同的元素,删除第一个
list.sort() #排序,默认升序
合并两个list要用“+”,或者extend,不能用append,那样它会把那个list直接放再最后一个元素
enumerate 用法(打印元素对应的下标)
for k,v in enumerate(xx):
print("index=%s,value=%s"%(k,v))
切片(string里面也可以使用切片)
name[n:m] 切片是不包含后面那个元素的值(顾头不顾尾)
name[n:m:s]
#s是步长,隔多少个元素取一次;步长是正数,从左往右取;步长是负数,从右往左取
List Comprehensions
实例1:要生成list [1, 2, 3, 4, 5]可以用:a = list(range(1,6))
实例2:生成[1x1, 2x2, 3x3, ..., 10x10]可以用 list = list(x * x for x in range(1,11))
实例3:for循环后面还可以加上if判断,这样我们就可以筛选出仅偶数的平方:list = list(x * x for x in range(1,11) if x%2== 0)
实例4:使用两层循环,可以生成全排列:
list = [m + n for m in 'ABC' for n in 'XYZ']
print(list),输出结果:['AX', 'AY', 'AZ', 'BX', 'BY', 'BZ', 'CX', 'CY', 'CZ']
实例5:for循环其实可以同时使用两个甚至多个变量,比如dict的items()可以同时迭代key和value:
d = {'x': 'A', 'y': 'B', 'z': 'C' }
[k + '=' + v for k, v in d.items()]
['y=B', 'x=A', 'z=C']
set 集合
set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。
创建:可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
x = set('runnoob')
print(x)
{'r', 'o', 'u', 'n', 'b'}
# set也可以使用comprehension,c里面只会有‘abc’
c = {x for x in 'aabbbcccc'}
a | b # 集合a或b中包含的所有元素
a & b # 集合a和b中都包含了的元素
generator
generator表达式的语法类似于python的"tuple类型的comprehension”,用圆括号()表示;而实际上tuple不像list,没有comprehension,所以不冲突。
list comprehension和generator表达式的主要区别在于,前者产生全部的list,后者每次仅产生一项,按需生成并“返回”结果。仅在接到请求的时候才会产生输出。因此,generator表达式比list comprehension更加节省内存
#每次都要调用next来生成
my_list = [1, 3, 6, 10]
a = (x**2 for x in my_list)
print(next(a))
# Output: 1
print(next(a))
# Output: 9 ,可以看见它里面是记录了index信息的
所以generator有以下特点:
- 遵循迭代器(iterator)协议,迭代器协议实现iter、next接口
- 能过多次进入、多次返回,能够暂停函数体中代码的执行
generator函数
在python的函数定义中,只要出现了yield表达式,那么事实上定义的是一个generator function,调用这个generator function返回值是一个generator。
def gen_generator():
yield 1
def gen_value():
return 1
if __name__ == '__main__':
ret = gen_generator()
print ret, type(ret)
#<generator object gen_generator at 0x02645648> <type 'generator'>
ret = gen_value()
print ret, type(ret)
# 1 <type 'int'>
下面是一个例子
def gen_example():
print('before any yield')
yield 'first yield'
print('between yields')
yield ('second yield')
print('no yield anymore')
gen = gen_example()
a = gen.__next__() # 第一次
print("第一次返回", a)
b = gen.__next__() # 第二次
print("第二次返回", b)
c=gen.__next__() # 第三次
print("第三次返回", c)
调用gen_example方法并没有输出任何内容,说明函数体的代码尚未开始执行。当调用__ next __()方法,generator会执行到yield 表达式处,并返回yield表达式的内容,然后暂停(挂起),所以第一次调用next打印第一句并返回“first yield”。 暂停意味着上下文都保存起来,直到下一次调用next方法恢复。第二次调用next之后就暂停在最后一个yield,再次调用next()方法,则会抛出StopIteration异常。
因为for语句能自动捕获StopIteration异常,所以generator(本质上是任何iterator)较为常用的方法是在循环中使用:
def generator_example():
yield 1
yield 2
if __name__ == '__main__':
for e in generator_example():
print(e)
generator函数和普通函数的区别
- generator函数包含一个以上的yield声明
- generator函数被调用的时候,会返回一个iterator对象,但是函数并不会立即开始执行
- iter()和next()方法被自动实现,所以可以使用next()函数对返回的此iterator对象进行迭代
- 一旦一个generator 执行到yield语句,generator函数暂停,程序控制流被转移到调用方
- 在对generator的连续调用之间,generator的本地变量和状态会被保存
最终,generator函数终止,再调用generator会引发StopIteration异常
generator是一个很棒的表示无限数据流的工具。无限数据流不能被保存在内存里面,并且因为generator每次产生一个item,它就可以表示无限数据流。下面的代码可以产生所有的奇数
def all_even():
n = 0
while True:
yield n
n += 2
使用场景:
1.当我们需要一个公用的,按需生成的数据;
2.A事情执行一部分,另一部分在B事件发生后再执行下一部分,实现异步。
lambda
可以这样认为,lambda作为一个表达式,定义了一个匿名函数,下面的代码x为入口参数,x+1为函数体。在这里lambda简化了函数定义的书写形式。是代码更为简洁,但是使用函数的定义方式更为直观,易理解
func=lambda x:x+1
print(func(1))
#>>2
#以上lambda等同于以下函数
def func(x):
return(x+1)
对于内置函数也很有用
#map(function,iteration) 会根据提供的函数对指定序列做映射
li = [11, 22, 33]
sl = [1, 2, 3]
new_list = map(lambda a, b: a + b, li, sl)
位运算
变量 a 为 60,b 为 13二进制格式如下:
a = 60 # 60 = 0011 1100
b = 13 # 13 = 0000 1101
(a & b) =12 #二进制解释: 0000 1100
a << 2 =240 #二进制解释: 1111 0000
集合
discard() 方法用于移除指定的集合元素。
该方法不同于 remove() 方法,因为 remove() 方法在移除一个不存在的元素时会发生错误,而 discard() 方法不会。
symmetric_difference():返回两个集合组成的新集合,但会移除两个集合的重复元素:也可以使用^