Python3.7.3 文档练习学习

Python教程

最近决定系统学习一下Python,按照3.7.3文档一步一步来。

文件编码

python2默认编码为ASCII,这就是为什么我们在编写代码出现中文时需要在第一行加上#coding=utf-8;python3默认编码为utf-8,因此python3不需要在出现中文时在第一行加上文件编码声明。只有当不使用默认编码时,才需要在开头加上# -*- coding: encoding -*-

运算符
  1. /永远返回浮点数运算,如果想进行整数运算可以使用除号//
  2. **表示乘方
字符串
  1. 字符串中有\表示转义字符,如果想让斜杠表示原始含义,可以在斜杠前再加一个斜杠表示双重转义即不转义了。或者在字符串前加r表示raw string原始字符串`r"\tea"。
  2. 过长字符串可以使用三个引号表示跨行连续输入,加\表示不自动换行,仍旧为同一行字符串。
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.'
  1. 变量可以和字面值字符串通过+连接:prefix + "phone", prefix='i'
  2. 字符串的索引功能、切片功能。切片注意:1)总是包括开始而不包括结束;2)切片索引之差=切片长度:“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
列表
  1. append()方法添加元素
  2. 切片赋值,增加列表长度或者清空列表:"hello"[:]=[]
  3. tips:print(a,end=",)可以取代print的换行符
  4. 快速拷贝副本,words[:],注意这样是浅拷贝
  5. 循环中修改列表值:
for w in words[:]:  # Loop over a slice copy of the entire list. 浅拷贝
...     if len(w) > 6:
...         words.insert(0, w)
range()
  1. range用法
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)
  1. range特性:print(range(1,10))的返回值是range(5,10),它表现地像一个列表但并不是,它会在你迭代它时返回真正的项,生成真正地列表,从而节省空间。因此range函数对象是一个可迭代对象,for是一个迭代器,list(range(5,10))则是另一个可以从可迭代对象中创建列表的迭代器。
条件控制语句
  1. 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
函数
  1. 函数定义会将函数名加入进符号表中,因此这个函数名可以像值一样赋值给其他变量,称为重命名机制。
  2. 当函数内部没有return语句时,返回值为None,一般控制台不会显示这个无聊的值。
  3. 设定参数默认值
    (1)默认值在函数定义处计算

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
  1. 关键字参数方式调用参数:function(key=word,key2=word2)

####### 列表更多特性

  1. 列表推导式的结构是由一对方括号所包含的以下内容:一个表达式,后面跟一个 for 子句,然后是零个或多个 for 或 if 子句。
  2. del 语句。 它不同于会返回一个值的 pop() 方法。 del 语句也可以用来从列表中移除切片或者清空整个列表(我们之前用过的方式是将一个空列表赋值给指定的切片)。
  3. 元组 、集合、字典

元组和列表的区别:

  • 元组不可变,列表可变
  • 元组通常包含多种不同类型的元素,列表通常包含同种类别元素
  • 元组一般通过解包和索引访问,列表通常使用迭代访问

集合:set()创建
字典:dict()

循环:

  • 字典中循环:items()
  • 单一序列循环:enumerate()
  • 多个序列循环:zip()
  • 循环修改列表:append()创建新列表更安全简单
  • 逆序循环reverse(range(5))
  • 按照指定排序顺序循环sorted()返回排序列表,并且是在不改变原列表的基础之上
总结与反思
  1. 学的素材多不一定是好事儿,有时会为了追求速度狗熊掰棒子,倒不如踏踏实实地拿到一份最新的教程文档(文档是最好的学习资源),反复阅读、练习、总结、整理、自我考核。我得培养这么几个习惯,一个是整理笔记,一个是复习笔记,最后一个是自我考核。这样才能确保有些东西我是真的弄懂了,并且很熟练。脚踏实地最重要!
1-5节自测考卷1
# 如何让两个数字进行除法运算得到整数?乘方如何表示?
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[:]
1-5自测考卷2
# 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)
1-5 自测考卷3


# 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)






你可能感兴趣的:(Python3.7.3 文档练习学习)