Python教程
最近决定系统学习一下Python,按照3.7.3文档一步一步来。
python2默认编码为ASCII,这就是为什么我们在编写代码出现中文时需要在第一行加上#coding=utf-8
;python3默认编码为utf-8,因此python3不需要在出现中文时在第一行加上文件编码声明。只有当不使用默认编码时,才需要在开头加上# -*- coding: encoding -*-
。
/
永远返回浮点数运算,如果想进行整数运算可以使用除号//
**
表示乘方\
表示转义字符,如果想让斜杠表示原始含义,可以在斜杠前再加一个斜杠表示双重转义即不转义了。或者在字符串前加r
表示raw string
原始字符串`r"\tea"。\
表示不自动换行,仍旧为同一行字符串。sen1 = """
我爱北京
天安门
"""
sen2 = """
我爱北京\
天安门
"""
输出结果:
我爱北京
天安门
我爱北京天安门
另一种方法是利用Python特性:相邻两个字符串如果引号挨着时将会自动连接:
>>> text = ('Put several strings within parentheses '
... 'to have them joined together.')
>>> text
'Put several strings within parentheses to have them joined together.'
+
连接:prefix + "phone", prefix='i'
。“Python”[1:3]长度为3-1
;3)使用过大值作为索引会爆出index error
,例如“Python”[42]
,但是切片使用过大索引会被默认处理:“Python”[2:42]
相当于从索引2一直取到字符串结尾。 +---+---+---+---+---+---+
| P | y | t | h | o | n |
+---+---+---+---+---+---+
0 1 2 3 4 5 6
-6 -5 -4 -3 -2 -1
append()
方法添加元素"hello"[:]=[]
print(a,end=",)
可以取代print的换行符words[:]
,注意这样是浅拷贝for w in words[:]: # Loop over a slice copy of the entire list. 浅拷贝
... if len(w) > 6:
... words.insert(0, w)
range(10):会生成10个值,从0-9
range(5,10):会从5开始生成5个值,5-9
range(0,10,3):会生成,0,3,6,9
# for循环
for i in range(len(list)):
print(list[i])
# 更方便的用法,enumerate
for i,l in enumerate(list):
print(i,l)
print(range(1,10))
的返回值是range(5,10)
,它表现地像一个列表但并不是,它会在你迭代它时返回真正的项,生成真正地列表,从而节省空间。因此range函数对象是一个可迭代对象,for
是一个迭代器,list(range(5,10))
则是另一个可以从可迭代对象中创建列表的迭代器。for...else...
的使用方法。注意这里else
当且仅当for循环执行完毕时执行,而不会在for循环执行break
语句后执行。# 打印0-10以内的素数和合数,合数用x*y的形式表示
for x in range(2,10):
for a in range(2,x):
if x%a==0:
print('合数',x,'=',a,'*',x//a)
break
else:# for循环遍历完列表时使用,或者while条件为负时使用
print('素数',x)
运行结果:
素数 2
素数 3
合数 4 = 2 * 2
素数 5
合数 6 = 2 * 3
素数 7
合数 8 = 2 * 4
合数 9 = 3 * 3
return
语句时,返回值为None
,一般控制台不会显示这个无聊的值。
i = 5
def f(arg=i):
print(arg)
i = 6
f() # 会打印5
(2)默认值为可变参数(列表、字典、类实例)时,共享默认值特性。
def f(a, L=[]):
L.append(a)
return L
print(f(1))
print(f(2))
print(f(3))
将会打印出:
[1]
[1, 2]
[1, 2, 3]
第二次调用函数时,默认参数`L`已经变成`[1]`了。
不想共享默认值方法:
def f(a, L=None):
if L is None:
L = []
L.append(a)
return L
function(key=word,key2=word2)
####### 列表更多特性
元组和列表的区别:
集合:set()创建
字典:dict()
循环:
items()
enumerate()
zip()
reverse(range(5))
sorted()
返回排序列表,并且是在不改变原列表的基础之上# 如何让两个数字进行除法运算得到整数?乘方如何表示?
9//3
9**3
# 字符串转义字符转与不转?
s1 = "\t"
s2 = "\\t"
s3 = r"\t"
# 过长字符串两种表示形式
s4 = """
我爱
北京天安门
"""
s5 = """
我爱\
北京天安门
"""
print(s1,s2,s3,s4,s5)
# 列表切片赋值、浅拷贝 什么是浅拷贝、深拷贝?
l2 = [1,2,3]
l3 = l2 # 直接赋值,共享变量引用,A改变则B改变
l4 = l2[:] # 浅拷贝,子对象不改变,没有子对象的情况下,A改变而B不改变
print(l2,l3,l4)
# 打印不换行,用逗号间隔句子
print([5,6,7],end=',')
# 循环中修改列表值,如果单词长度大于6,在列表末尾添加该单词
word = [1,3,6,9]
for w in word[:]: # word[:]不会发生改变而word改变了
if w > 6 :
word.append(w)
print(word)
# range 三种参数用法
range(10)
range(5,10)
range(1,10,3)
# range遍历列表和enumerate遍历列表两种方式
for i in range(len(word)):
print(word[i])
for i,w in enumerate(word):
print(i,w)
# for break else 的用法 打印素数和合数 如果从break中跳出来并不会进入else语句,算是一种新的逻辑形式吧
for number in range(2,11):
for i in range(2,number):
if number%i == 0:
print(f'合数{number}={i}*{number/i}')
break
else:
print(f'素数{number}')
# 设置参数默认值两种特性:默认值为可变参数时共享默认值,不想共享时怎么办
i = 5
def fun(arg=i):
print(arg)
i = 6
fun()
def fun2(arg=[]):
arg.append('hello')
print(arg)
fun2()
fun2()
def fun3(arg=None):
if arg==None:
arg = []
arg.append('hello')
print(arg)
fun3()
fun3()
浅拷贝和深拷贝用法:直接赋值、copy.copy()、copy.deepcopy()
浅拷贝和深拷贝原理详解
第一个链接介绍了基本用法, 再附上两种效果相同的浅拷贝方式:
list.copy()
list[:]
# 5.1.列表的更多特性
l = ['orange', 'apple', 'pear', 'banana', 'kiwi', 'apple', 'banana']
# 末尾添加一个元素
l.append('niumeng')
print(l)
# 末尾扩展多个元素
l.extend(['1','2','3'])
print(l)
# 在固定位置插入一个元素
l.insert(1,'watermelon')
print(l)
# 移除列表中固定值的元素
l.remove('apple')
print(l)
# 删除固定位置元素
l.pop()
print(l)
l.pop(0)
print(l)
# 清空整个列表
# l.clear()
# 返回列表中某个固定值的索引
l.index('pear')
# 返回某个值出现的次数
l.count('orange')
# 对列表元素进行正序排列、逆序排列:按照字符和数字的ARSCI表中排序
l.sort()
print('sort',l)
l.sort(reverse=True)
print('sort reverse',l)
# 翻转列表元素
l.reverse()
print(l)
# 5.1.1 作为栈使用的方法
l.append('obj')
l.pop()
# 5.1.2 作为队列使用的方法:deque模块
l.append('obj1')
l.pop(0) # 在列表的开头插入或弹出元素速度比较慢,因为所有元素必须移动一位,collections.deque 被设计快速地从两端操作
from collections import deque
q = deque(['a','b','c'])
q.append('d')
print(q)
q.popleft()
print(q)
# 返回的是deque对象
# 5.1.3 列表推导式:按照顺序从左到右写for和if语句,生成值位于首位,提供一个例子
newl = [(i,j) for i in range(10) for j in range(3) if i*j > 10]
print(newl)
# 5.1.4 翻转矩阵 嵌套列表推导式 两种方式:zip()
# 1 2 3
# 4 5 6
# 7 8 9
matrix = [[1,2,3],[4,5,6],[7,8,9]]
new_matrix = []
for i in range(3):
tmp = []
for line in matrix:
tmp.append(line[i])
new_matrix.append(tmp)
new_matrix2 = [[line[i] for line in matrix] for i in range(3)]
new_matrix3 = list(zip(*matrix)) # *这个解包符号是用来把列表、矩阵分解成单个元素和列表的,相当于一个打包和拆开的过程
print(new_matrix,new_matrix2,new_matrix3)
# del 删除l某个索引元素 和pop进行比较 ; 删除切片 和切片赋值比较 ; 删除整个变量
l1 = ['a','b','c','d','e','f']
l1.pop() # 会返回输出值
print(l1)
del l1[-1]
print(l1)
del l1[0:2]
print(l1)
del l1
# 创建元组 0个元素 1个元素 多个元素三种方式
t1 = 'a','b','c' # 元组打包:把元素打包进一个元组
t2 = ()
t3 = 'd',
print(t1,t2,t3)
# 元组打包和序列解包
x,y,z = t1 # 序列解包:把元组中的元素解包后放进变量
print(x,y,z)
# 交集、并集、差集、对称差、
s1 = set('abdaanbcdefg')
s2 = set('aceghij')
print(s1&s2)
print(s1|s2)
print(s1-s2)
print(s1^s2)
# 创建字典、改变value、获得value、删除键值对、判断键值对是否存在、获取key列表、插入键值对、键值对按照key排序
d = {'name':"niumeng","age":19,"other":"o"}
d['age'] = 20
del d["other"]
print(d)
if "name" in d:
print('yes')
print(list(d)) # 返回key组成的列表
print(sorted(d)) # 按照key的字典顺序进行排序
# dict 创建字典:1.构造函数法 字典作为参数, 列表作为参数 2. 关键字参数法(key是简单字符串时)
d2 = dict({'name':"niumeng","age":19,"other":"o"})
print(d2)
d3 = dict(name=19,age=20)
print(d3)
d5 = dict([("name","niumeng"),("age",19)])
print(d5)
# 列表推导式创建字典
d4 = {x:x**2 for x in {2,4,6}}
print(d4)
# 列表循环 items()
for k,v in d.items():
print(k,v)
# 在多个序列中循环 zip()
l2 = ['what your name','how are you']
l3 = ['niumeng','fine']
for q,a in zip(l2,l3):
print(q,a)
# 逆向循环序列
for i in reversed(range(2,10,2)):
print(i)
# sorted() 循环列表
l = ['apple','orange','banana']
for i in sorted(l):
print(i)
print(l)