python怎么复习_python 复习与总结

概述

这篇文章,我花了一周的时间将代码和图片整数上来,这篇文章被分成了两个部分,一个是我在数据学习社区里面写的一些基本的代码,我将图片贴了上来,内容和猴子老师的差不多;第二部分是我自己看的官方文档的部分,因为我之前没有看过官方的文档,回过头来发现必看的内容我居然漏了。官网的东西是最新的,最正宗的,看书的时候发现python的书太多了,但是很多书的代码已经过时了。尤其是一些第三方库,python2和python3不相同确实是个大坑。总之对官网内容的学习算是查漏补缺吧,Keep learning。

第一部分

代码贴图

这里要注意集合的方法,update可以一次添加多个元素,但是add方法则只能添加一个元素进去,要注意的是update接收列表,这样才能传入多个元素,如果不传入列表类型的话,会将每一个字符分开。

people = {"爸爸","妈妈","孩子"}

people.add("爷爷","奶奶")#这样会报错,因为add方法直接一个元素

people.update([,"爷爷","奶奶"])#这样就没问题

people.update(,"爷爷","奶奶")#这样会出错,因为输出的会是

{"爷","奶"}

#discard方法不能接收列表作为参数因此一次也只能删除一个元素

第二部分

交互模式下的一些技巧

’-‘ 活用下划线,在交互模式中,下划线是一个变量,可以存贮上一次计算出的结果。

#下划线作为变量的例子

a = 10

b = 20

a + b

30

c = 40

c + _

70

这里要注意下划线变量是一个只读变量,不能给他赋值。

字符串

在python3中已经不能用反斜杠去换行了,如果字符串很长的话,需要可以用下面的形式去将长字符串连在一起。

my_string = "I love to eat humbuggers " " and also I like drinking Cocal"

print(my_string)

I love to eat humbuggers and also I like drinking Cocal

这种形式只能用在两段字符串之间,不能用于变量或者是括号。

用’+’ 去连接变量和字符穿,比如

str = ‘py’

Str + ’thon’

‘python’

Python字符串输出的方法,记住一个语法,加上自动填充符号的语法。在python中使用format方法格式化输出是最好最强大的。

print(“{:*^20}”.format(“hanxiao”)) = print(“hanxiao”.center(20, ‘*’))

#字符串打印的一个技巧右对齐

"""这种打印的方法等同与使用函数center、ljust,rjust"""

print("characters".center(20,'*'))

>>>**********characters**********

print("characters".ljust(20, '*'))

>>>character********************

print("characters".rjust(20, '*'))

>>>********************characters

一点小小的体会总结:写到这里python的坑挺大的,其实之前一直有这样的体会。但说不清楚。str这个函数在C里面没有,在C++里面是作为一个类存在的。

因为之前写C或者C++的时候习惯用str去命名字符串。用C/C++写的代码感觉是确实要更健壮一些,python的确十分适合快速开发,但是python其实并不简单,写完代码没有编译过程直接运行,有什么debug起来确实要麻烦一些,C语言简单,我很喜欢,但是C++确实强大了不少,我会继续保持C++和数据结构与算法的学习。

关于下标的问题

在python中下标 -0 等于0,别忘了反向遍历用-1.

如果使用一个特别大的下标(超出了字符串本身的长度很多)那么会导致错误发生。,但是用切片可以避免切片出现。

Word = ‘python’

Word [42]会报错,

但是word[4:42] 会显示’on’,

如果是word[42:] 会显示空白字符串

由于python的字符串是无法改变的,因此通过给下标赋值,获取新的字符串是会报错的,

比如:

Word [0] = ‘J’ 这样就会报错

要改变的话只能新创建一个字符串

‘J’ + word[1:]

"""用python写Fibonacci数列的最简单办法:这个循环获取费氏数列中小于10的数"""

a,b = 0 ,1

While a < 10:

Print(a)

a,b=b,a+b

字符串中‘*’,可以看作是复制,而不是数字的乘以。

Control Flow 控制流

这个没啥好说的了格式记住就可以了

生成器(generator),别忘了生成器和函数很像,只是在最后的时候用yield返回。最常用的range();函数enumerate()可以返回一个迭代对象的索引下标和值,

List1 = [‘yiyang’, ‘pangbao’, ‘bama’, ‘wo’]

#enumerate的用法

for inede, name in enumerate(list1):

print(index, name)

else语句

else 语句在循环中的使用很有意思

for n in range(2, 10):

for x in range(2,n):

If n % x == 0:

print(n,’equals’, x, ‘*’, n//x)

break

else:

#loop fell through without finding a factor

print(n, ‘is a prime number’)

瞎捣鼓了一个九九乘法表,代码如下

for n in range(1,10):

for m in range(1,10):

print(n,’*’,m,’=‘,n*m,end=‘\t')

print(‘\n')

输出结果:

有个常用的pass站位符,写函数常会用到,了解一下,就可以了。

复习到这里,我觉得开始写一下三种基本排序方法很有必要了。

冒泡排序:

length = len(collection) 这里的长度等于是列表元素的个数

list1 = [1,2,3,4,5]

len(list1) = 5

for I in range(length) #range = 0-5

#导入

from __future__ import print_function

#函数定义

def bubble_sort(collection):

“””Bubble sort practice”””

length = len(collection)

for I in range(length-1):

swapped =False

for j in range(length-1-i):

If collection[j] > collection[j+1]:

swapped = True

collection[j],collection[j+1] = collection[j+1], collection[j]

return collection

#入口

If __name__ == ‘__main__’:

try:

raw_input #python 2

except:

raw_input = input

user_input = input(“Enter numbers separated by comma:”).strip()

unsorted = [int(number) for number in user_input.split(‘,’)]

print(*bubble_sort(unsorted))

选择排序,选择排序遇到了问题,我没有搞懂,花了一些时间,写出对程序始终无法正确排序。选择排序一般先到最小值或最大值,这一步非常简单,但是比较一下找最大值和最小那个更简单的话,我觉得找最小值更简单一些。我试着用找最小值的方法写了一下选择排序。无法排出正确的大小,换了找最大值的方法也不行。

过了一天,我重新开始写选择排序了,这次比上回好一些,但是得出的排序顺序和我想的不一样,我需要的是升序,而我写出来的代码是降序排序,代码如下:

def selection_sort(numbers):

for i in range(0, len(numbers)):#第一层控制最大值的交换

maxi = i#从第一个数开始找最大值

for j in range(i+1, len(numbers)):#第二层负责找大最大值

if numbers[maxi] < numbers[j]:

maxi = j#找到最大值的下标

number[maxi], numbers[i] = numbers[i], numbers[maxi]#交换最大值

return number

if __name__ == '__main__':

user_input = input("Enter numbers: ").strip

unsorted = [int(number) for number in user_input.split(',')]

print(selection_sort(unsorted))

上面的代码写出来之后,找到了一点感觉,趁热打铁写了出来:

def select_sort_ascending(numbers):

for i in range(len(numbers)-1, 0,-1):

maxi = 0

for j in range(1, i+1):

if numbers[maxi] < numbers[j]:

maxi = j

numbers[maxi], numbers[i] = numbers[i], numbers[maxi]

return numbers

if __name__ == '__main__':

user_input = input("Enter numbers: ").strip()

unsorted = [int(number) for number in user_input.split(',')]

print(selection_sort(unsorted))

这下终于对了。

插入排序:

插入排序,简单的来说就像是手里拿着扑克,将数字一个个插入进来一样。

def insertion_sort(numbers):

length = len(numbers)

for i in range(1, length):

while i > 0 and numbers[i-1] > numbers[i]:

numbers[i], numbers[i-1] = numbers[i-1], numbers[i]

return numbers

if __name == "__main__":

user_input = input("Enter numbers to sort separated by comma: ").strip()

unsorted = [int(number) for . number in user_input.split(',')]

print(insertion_sort(unsorted))

插入排序可以很好的工作,得到的结果没问题。

接下来需要重新看看数据结构的知识了。

函数递归

受上面fibonacci数列的影响,我又折腾了一下fibonacci数列。这里我写了一个fibonacci数列,用来做递归演示,输入一个数字,这个数字表示fibonacci数列中的第N项,函数可以返回fibonacci数列上的这个数。

def fibonacci(position):

“””

Enter the Nth number to get the number in the fibonacci series

“””

if position == 0:

return 0

if position == 1:

return 1

else:

return fibonacci(position-1) + fibonacci(position-2)

If __name__ == ‘__mian__’:

user_input = input(“Enter a number to get the Nth number in fibonacci series:”)

position = int(user_input)

number = fibonacci(position)

print(number)

在函数中return 可以以元祖的形式返回多个值,我之前将上面的函数第一个If判断后的return返回值改成0,1,得到了这样一个元祖。

另外一个函数遇到了一个小问题,不知道为什么用脚本运行出来之后最后输出一个None。

def fibonacci_numbers(number):

"""Enter a number to get numbers are smaller than it in the fibonacci squences"""

If number == 0:

return 0

else:

a, b = 0, 1

while a < number:

print(a)

a, b = b, a + b

If __name__ == ‘__main__’:

user_input = int(input(“Enter a number to get the numbers are smaller than it in the fibonacci sequence: “))

print(fibonacci_numbners)

输出为:

接下来稍稍改进一下,用列表去存储生成的数字。

def fibonacci_list(number):

“””

Using list to store the numbers in fibonacci sequence

“””

If number == 0:

return []

else:

a, b = 0 ,1

result = []

while a < number:

result.append(a)

return result

If __name__ == ‘__main__’:

user_input == int(input(“Enter a number to get the numbers are smaller than it in fibonacci sequence:”))

print(fibonacci(user_input))

这样得到是一个不包含None的列表。

函数参数的警告:

函数的默认参数只能被评估一次,因此它具有易变形,尤其是像列表,字典,实例或者是大部分的类。例子如下:

def f(a , L = []):

L.append(a)

return L

f(10) 打印出来的话>>>[10]

f(20) ——>>>[10,20]

f30) ———>>>[10,20,30]

未来避免类似的情况可以这样写:

def f(a, L=None):

if L == None:

L = []

L.append(a)

return L

>>>f(10)

[10]

>>>f[20]

[20]

>>>f(30)

[30]

关键字参数

关键字参数的kwarg要注意的几个地方:

第一、不能缺失必要的值

第二、关键字参数要在非关键词参数后

第三、不能重复的赋值

第四、不能输入错误的关键字

以上代码源于我想吃康师傅香辣牛肉面而不得,愤懑而书,纽约为什么每一家卖康师傅的超市了?

一个*星号的协议参数要放在关键字参数的前面。关键字参数有两个星号**。协议参数写作*args,关键字参数再来记一下**kwargs。

这里遇到一个比较好玩的函数,两行代码,足够显示python的强大了。

def concat(*args, sep= “/“):

return sep.join(args)

join这个函数很神奇,是一个字符串类下的方法。

Name = “xiao"

Sep = ‘/'

Sep.join(name)

会得到"x/i/a/o/"

在函数传参数的时候,如果遇到了参数没法分开的情况,可以用解包的办法传入参数:

list(range(3, 6)) ——> [3,4,5]

Args = [3, 5]

List(range(*args))—->可以得到一样的结果[3,4,5]—>通过一个星号,* 家名字的方法可以作为函数的参数传入到函数中

同样的办法,字典可以用这样的方法进行解包,因为字典是mapping类型的容器,那么将字典用两个**星号加名字传入函数中可以获取到相关的信息。

Lambda匿名函数

Lambda anonymous function匿名函数:lambda 变量:表达式

Lambda函数也可以在包含的范围内

文档字符串的写法

首先是第一行一定要简短,要包含这个对象的目的。它不应该精确的陈述对象的名字或者类型,第一行要用大写字母开头,逗号结尾。如果文档字符串很多的话呢,第二行应该是空格。

输出函数的文档用方法.__doc__

函数注释---> 选择项

python代码风格:四个空格,而不是用tab键

每行不要超过79个字符

用空行去分割函数、类,还有函数中更大的代码模块

尽可能将注释放到单独的一行

使用文档字符串

使用空格键在运算符两边,在逗号之后

用大写字母开始命名类,各个词之间都要大写,用下划线分割函数和方法,始终使用self方法作为第一个方法协议

使用python默认的编码

不要使用非ASCII字符

数据结构

列表

列表的方法

list.append()#在最后追加一个元素

list.extend() #连接两个列表

list1 = [1,2,3,4]

list2 = [5,6,7,8]

list1.extend(list2)

list1 = [1,2,3,4,5,6,7,8]

list.insert(index, value) #->在指定位置插入一个元素

list.remove(value) #删除一个值

list.pop()#默认弹出最后一个元素

list.clear()#清除列表

list.index(value, index)#获取某一值的位置

list.count(value)#值在列表中出现的次数

list.reverse()#反转列表

list.sort()#**排序,会改变列表本身顺序,而内建函数sorted()则不会改变列表本身

list.copy()#返回一个文本,而不是本身

list1 = [1,2,3,4]

list2 = list1.copy()

list2.append(5)

>>print(list2)

[1,2,3,4,5]

>>>print(list1)

[1,2,3,4]

像堆栈一样使用列表

一点点数据结构复习

堆栈,stacks--->Last in, First out.

队列,queues-->First in, First out.

在python中列表非常强大,可以将列表当作stacks使用,如list.append()可以插入一个元素到最后的位置,然后用list.pop()将其弹出并获得。也可以将列表当作queues队列使用,这个基本的数据结构在collection 这个库里面,这是一个python自带的一个非常重要有用的库,可以先学习。如:

from collections import deque

queue = [“ZhangSan”, “LiSi”, “WangWu”]

queue.append(“SongLiu”)

queue.append(“LiuQi”)

queue.popleft()

>>>’ZhangSan’

queue.popleft()

>>>’LiSi’

queue

>>>[‘WangWu’, ’SongLiu’, ‘LiuQi']

python列表推导式

列表推导式非常的pythonic,非常的方便和强大,除了列表推导式外,也有元祖推导式,字典推导式,和集合推导式,但是集合推导式得到的是一个生成器generator。关于推导式,可以在后面再复习一下。

列表推导式可以非常简洁的创建一个列表,常见的用法是把某种操作应用于序列或可迭代对象的每个元素上,然后使用其结果来创建列表。通常我们创建一个列表的方法是:

result = []

for I in range(10):

result.append(I**2)

result

>>>[0,1,4,9,16,25,36,49,64,81]

列表生产式的写法:

result = [i**2 for i in range(10)]

列表推导式中for语句后面也可以接for或者if语句,例如:

[(x, y) for x in [1,2,3] for y in [3,1,4] if x != y]

[(1,3), (1,4), (2,3), (2,1), (2,4), (3,1), (3,4)]

#上面式子等价于

combs = []

for x in [1,2,3]:

for y in [3,1,4]:

if x != y:

combs.append((x, y))

>>>combs

[(1,3), (1,4), (2,3), (2,1), (2,4), (3,1), (3,4)]

更多关于列表推导式的内容:

>>>vec = [-4, -2, 0, 2, 4]

>>>#create a new list with the values doubleed

>>>[x*2 for x in vec]

[-8, -4, 0, 4, 8]

>>>[x for x in vec if x>=0]

[0, 2, 4]

>>>[abs(x) for x in vec]

[4, 2, 0, 2, 4]

>>>#call a method on each element

>>>fresh fruit = [' banana', ' loganberry', 'passion fruit ']

>>>[weapon.strip() for weapon in freshfruit]

['banana', 'loganberry', 'passion fruit']

>>>#create a list of 2-tuples like (number, square)

>>>[(x, x**2) for x in range(6)]

[(0,0), (1,1), (2, 4), (3, 9), (4, 16), (5, 25)]

>>>#the tuple must be parenthesized, otherwise an error is raised

>>>#元祖必须要加上括号才行,不然就会报错

>>>#flatten a list using a listcomp with two 'for'

>>>#将一个嵌套的列表合为一个列表需要用到多个for

>>>vec = [[1,2,3], [4,5,6], [7,8,9]]

>>>[num for elem in ver for num in elem]

[1,2,3,4,5,6,7,8,9]

#列表推导式可以使用复杂的表达式和嵌套函数

>>>from math import pi

>>>[str(round(pi, i)) for I in range(1,6)]

['3.1', '3.14', '3.142', '3.1416', '3.14159']

#将参数pi和i传入到函数round中,第一个参数为值,第二个参数为小数点后面的位数,

#随着循环的迭代,逐渐增加小数点后面的位数,然后将浮点型数据转化成字符串类型。

嵌套的推导式

列表推导式中最先的表达式可以是任意形式的表达式,甚至包括了另一个列表推导式。

下面的例子非常好,矩阵转置:

>>>matrix = [

[1,2,3,4],

[5,6,7,8],

[9,10,11,12],

]

#下面的列表推导式将会转置行和列

>>>[[raw[i] for row in matrix] for i in range(4)]

[[1, 5, 9], [2, 6, 10], [9, 10, 11, 12]] #------->numpy里面有.T 可以直接转置一个矩阵

在实际应用中,我们我们应该会更喜欢用内置的函数去组成复杂的流程语句。zip()函数可以很好的处理这种情况。zip函数将数据打包在一起。比如:

names = [“ZhangSan”, “LiSi”, “WangWu”]

Indexed = [‘1’, ‘2’. ‘3’]

list(zip(names, indexed))

>>>[('zhangsan', '1'), ('lisi', '2'), ('wangwu', '3’)]

#或者是

dict(zip(names, indexes))

>>>{'zhangsan': '1', 'lisi': '2', 'wangwu': '3’}

这样可以轻松的创建一个字典

这里再次回顾一下解包参数列表,如果一个函数需要超过一个参数的话,比如range函数需要单独的参数start和stop参数。如果要传入的参数不能单独使用的话,运用’*’星号运算符编写函数调用以从列表或者元祖种捷报解包参数。

例子:

list(range(2,6))

[3,4,5]

args = [3,6]

List(range(*args))

[3,4,5]

我觉得官方文件的这个例子不是很直观,我的理解可能更准确,用zip()函数作为例子:

list_to_dict=[["ZhangSan", "1"], ["LiSi", "2"], ["WangWu", "3"], ["ZhaoLiu", '4’]]

list(zip(*list_to_dict))

[('ZhangSan', 'LiSi', 'WangWu', 'ZhaoLiu'), ('1', '2', '3', '4’)]

我本来想用这个函数像上面一样去创建一个字典,可是不知道解包参数这里不行。只能生成列表。后续会回头看看这个用法。

Del语句

#del 语句可以按照给出的索引值删除元素,例如:

a = [1,2,3,4,5]

del a[0]

>>>a

[2,3,4,5]

del a[2:4] #删除2-3位的元素

>>>[2,5]

del a[:] #or del a

>>>a

[]

元祖

记住一点就可以了,元祖就是无法改变的列表,和字符串一样的。然后就是元祖的解包

t = (10,20,30)

a, b, c = t

Print(a, b, c)

>>>10 20 30

集合

顾名思义,就是集合(set),集合类型提供了一个无序的不重复元素的集。同样用花括号{}去表示,基本的用法是测试和消除重复的元素。集合对象也提供了数学运算比如并集,交集,差集和对称差分。利用set()创造一个集合。创建一个空的集合只能用set()而不能用{}.花括号是用来创建空字典的。

basket = {‘apple’, ‘orange’, ‘apple’, ‘pear’, ‘organge’, ‘banana’}

Print(basket)

>>>{‘orange’,’banana’, ‘pear’, ‘apple’}

‘orange’ in basket

>>> True

‘crabgrass’ in basket

>>>False

#完成集合运算在两个单独词语中

a = set(‘abracadabra’)

b = set(‘alacazam’)

>>>a

{‘a’, ’r’, ’b’, ’c’, ’d’}

a - b #字母在a但不在b中

>>>{‘r’, ‘d’, ‘b’}

a | b #字母在a或在b中或者两者都在

>>>{‘a’, ‘c’, ‘r’, ‘d’, ‘b’, ‘m’, ‘z’, ‘l’}

a & b #字母即在a又在b

>>>{‘a’, ‘c’}

a ^ b #字母在a或在b但不同时在两者中

>>>{‘r’, ‘d’, ‘b’, ‘m’, ‘z’, ‘l’}

#集合推导式:

a = {x for x in ‘abracadabra’ if x not in ‘abc’}

>>>a

{‘r’, ‘d’}

字典

映射类型字典。字典的键为不能更改的类型,字符串、整数、元祖经常作为键key,元祖如果只包含字符串、数字或者元祖的话。不管是直接或者非直接的使用可改变类型,都不能作为key使用。可以看作是一个键值对。用list()函数可以将字典的key都列出来。利用内置函数sorted()对字典排序,利用逻辑运算符in查看key是否在字典中。

循环技术

遍历一个字典的key和值时使用.items()

利用函数enumerate在for循环中获取索引和值

利用zip将两个或两个以上的序列同时遍历:

questions = [’name’, ‘quest’, ‘favorite color’]

Answers = [‘lancelot’, ’the holy grail’, ‘blue’]

for q,a in zip(questions, answers):

print(‘What is your {0}? It is {1}.’.format(q,a))

What is your name? It is lancelot.

What is your quest? It is the holy grail.

What is your favorite color? It is blue.

#遍历反向输出:for i in reverse(range(1,10,2)):

9

7

5

3

1

#利用sorted遍历一个序列,可以返回一个新的排序的列表,同时保持原来的数据不变

basket = [‘apple’, ‘orange’, ‘apple’, ‘pear’, ‘orange’, ‘banana’]

for f in sorted(set(basket)):

print(f)

apple

banana

orange

pear

#有时候试图在遍历的时候改变一个列表,那么最好重新创建一个新列表代替它。

Import math

Raw_data = [56.2, float(’Nan’), 51.7, 55.3, 52.5, float(’Nan’), 47.8]

filtered_data = []

For value in raw_data:

If not math.isnan(value):

Filtered_data.append(value)

Filtered_data

>>>[56.2, 51.7, 55.3, 52.5, 47.8]

#Is,is not 是比较运算符,它们比较一个对象是否是同一个对象,这个只有关乎于可变对象,比如列表。

list1 = [1,2,3,4]

>>> list2 = [5,6,7,8]

>>> list1 is list2

False

>>> list3 = list1

>>> list1 is list3

True

这里要注意is 和 == 的区别:is它比较多是一个对象是否是同一个对象。

序列的比较——>短序列小于长序列。

模块

sys模块

Sys.ps1和sys.ps2定义用作辅助提示的字符串

import sys

sys.ps1

'>>>’

Sys.ps2

‘…'

Sys.ps1 = ‘C>’

C> print(‘Yuck!’)

Yuck!

C>

这两个变量只有在交互模式下才能被定义

import sys

sys.path 用于确定解释器模块和搜索路径

dir()用于查找模块定义的名称,它返回一个排序过的字符串列表

我在写import dir()函数代码的时候有一个小发现,我之前写了一个才数字程序名字叫py.py

我导入了程序得到了以下的结果:

import py,sys

Enter your number to start the game: 1

Your number is too small.

You have 4 opertunities.

Enter your number to start the game: 50

Your number is too small.

You have 3 opertunities.

Enter your number to start the game: 2

Your number is too small.

You have 2 opertunities.

Enter your number to start the game: 3

Your number is too small.

You have 1 opertunities.

Enter your number to start the game: 4

Your number is too small.

You have 0 opertunities.

You don't have more opertunities!

>>> import py

程序自动启动了,但是只有在和sys模块同时导入的时候才行。

后来我用其他的程序再试了几下,都可以在交互模式下启动,所以同时导入sys和其他python程序可以直接在交互模式下启动程序。

Dir()函数

必须要有__init__.py 才能让python将包含该文件的目录当作包。

以下是来自官方的一段话:

“请记住,使用 from package import specific_submodule 没有任何问题! 实际上,除非导入的模块需要使用来自不同包的同名子模块,否则这是推荐的表示法。”

格式化输出

f/F“{variable}”

.format()

str()和 repr()可以快速的显示变量已进行调试。

格式化串文字:

import math

print(f’The value of pi is approximately {math.pi:.3f}.’)

The value of pi is approximately 3.142.

在’:’后面传递一个整数可以让该字段成为最小字符宽度。这在使列对齐时很有用:

table = {’Sjoerd’: 4127, ‘jack’: 4098, ‘Dcab’: 7678}

For name, phone in table.items():

Print(f”{name:10}==>{phone:10d}”)

Sjoerd ==> 4127

Jack ==> 4098

Dcab ==> 7678

>>> name = 'Xiao Han'

>>> f"{name:20}", '$'*10,"{name:10}"

('Xiao Han ', '$$$$$$$$$$', '{name:10}')

>>>

print(f"{name:20}", f"$*10",f"{numbr:10}")

Xiao Han $*10 917

如果有一个长字符串最好用名称来引用变量进行格式化。

可以通过传统字典和使用[ ] 访问键来完成。

table= {’Sjoerd’: 4127, ‘Jack’:4098, ‘Dcab’: 8637678}

print(‘Jack: {0[Jack]:d}; Sjoerd: {0[Sjoerd]:d};’Dcab: {0[Dcab]:d}’.format(table))

#0代表的是table这一个标量,因为一直是这一个变量在格式化输出,用字典中的键去访问值,d表示整数。

简单一点的做法是用’**’两个星号作为关键字参数传递:

print(‘Jack:{Jack:d}; Sjoerd: {Sjoerd:d};Dcab:{Dcab:d}’.format(**table))

记住一点“:“后面跟的是距离前面的距离,符号在方向的后面:

>>> for x in range(1,11):

... print('{0:#<5d}{1:*^10d}{2:@>10d}'.format(x,x*x,x*x*x))

...

1####****1*****@@@@@@@@@1

2####****4*****@@@@@@@@@8

3####****9*****@@@@@@@@27

4####****16****@@@@@@@@64

5####****25****@@@@@@@125

6####****36****@@@@@@@216

7####****49****@@@@@@@343

8####****64****@@@@@@@512

9####****81****@@@@@@@729

10###***100****@@@@@@1000

> 表示在左边

字符串方法.zfill()可以在数字字符串的左边填充零,它能识别正负号:

>>>’12’.zfill(5)

00012’

>>>’-3.14’.zfill(7)

‘-003.14’

>>>’3.14159265359’.zfill(5)

‘3.14159265359’

#我的测试

>>> '19'.zfill(10)

'0000000019'

>>> '-19.08'.zfill(10)

'-000019.08'

>>> '19.08'.zfill(10)

'0000019.08'

>>> '19.08'.zfill(11)

'00000019.08'

>>> '19.08'.zfill(12)

‘000000019.08'

读写文件

也没啥好说的

最好的办法是with open,读写的几个模式r 读,r+ 读写,w写,a追加。

如果不用with 要记住关闭文件用close()

文件的方法

read()

readline()

Write()

tell() #返回一个整数,给出文件对象在文件中的位置。

seek(offset,from__what) #第一个是位置参数,起点有第二个参数from__what参数指定。0表示从头开始,1表示从当前位置开始,2表示从末尾作为参考点。

>>>f = open(‘workfile’,’rb+’)

>>>f.write(b’0123456789abcdef’)

16

>>>f.seek(5) #Go to the 6th byte in the file

5

>>>f.seek(1)

b’5’

>>>f.seek(-3, 2) #Go to the 3rd byte before the end

13

>>>f.read(1)

b'd'

使用json保存结构化数据

import json

json.dumps([1, ’simple’,’list’])

‘[1, “simple”,”list”]'

#dumps()函数的另一个变体叫做dump(),它只将对象序列化为text file。因此,如果f是一个text file对象,我们可以#这样做:

json.dump(x, f)

#要再次解码对象,如果f是一个打开的以供阅读的text file对象:

x = json.load(f)

异常

如果try语句发生了异常,那么则跳过该子句中剩下的部分。然后,如果异常的类型和excpt关键字后的异常匹配,则执行except子句,然后继续执行try后面的代码。

如果发生的异常和except子句中指定的异常行为不匹配,则将其传递到外部的try语句中,如果没有找到处理程序,则它是一个未处理异常,执行将停止并显示如上所示的消息。

except(RuntimeError, TypeError, NameError):

Pass

try,except,else

else 子句可以避免try except接收到的异常,因此要比在try子句中添加代码要好一些。

抛出异常

raise 允许程序员强制发生指定的异常。例如:

raise NameError(‘Hi there’)

Traceback (most recent call last):

File "", line 1, in

NameError: HiThere

raise 唯一的参数就是要抛出的异常,这个参数必须是一个异常实例或者是一个异常类.

try的另一个字句是finally,它将无论如何都会执行,无论有没有发生异常,即便是在try语句中通过break,continue,return这些语句离开finally也会在离开前被执行。

def divide(x, y):

try:

result = x/y

except ZeroDivisionError:

print("Division by zero!")

else:

print("result is", result)

finally:

print("executing finally clause")

>>> divide(2, 1)

result is 2.0

executing finally clause

>>> divide(2, 0)

division by zero!

executing finally clause

>>> divide("2", "1")

executing finally clause

Traceback (most recent call last):

File "", line 1, in

File "", line 3, in divide

TypeError: unsupported operand type(s) for /: 'str' and 'str'

del 可以删除类里面的属性,例如:

del moname.the_answer #删除moname模块中的the_answer 属性

注意一下命名空间和作用域。

def scope_test():#定义函数

def do_local():#嵌套函数

spam = "local spam"#函数里面定义给变量spam赋值,注意此时的作用域

def do_nolocal():#嵌套函数

nonlocal spam #嵌套函数内部定义变量spam的作用域

spam = "nonlocal spam"# 定义变量spam

def do_global():#嵌套函数

global spam #在嵌套函数内部定义变量spam作用域

spam = "global spam"#定义变量spam

"""整个函数执行的过程||V||V||V||V是自上而下的"""

spam = "test spam"

do_local()

print("After local assignment:", spam)

do_nonlocal()

print("After nonlocal assignment:",spam)

do_global()

print("After global assignment:",spam)

scope_test()

print("In global scope:", spam)

以上的代码执行之后会得到

After local assignment: test spam

After nonlocal assignment: nonlocal spam

After global assignment: nonlocal spam

In global scope: global spam

l

class MyClass:

"""A simple example class"""

i = 12345

def f(self):

return "Hello, world"

这里注意一下,第一类的命名要用大写字母开头,驼峰命名法,MyClass.i 和MyClass.f都是类的属性,所以也同样可以通过MyClass.i 去给属性赋新的值。

类的_init__方法

x.counter = 1

while x.count < 10:

x.count = x.counter * 2

print(x.counter)

def x.counter

以上代码可以简单的改一下成为pow方法。

方法的第一个参数被命名为self,这是一个约定。

关于类的内容我会单独的写一些。

collections 包---基本的数据结构

下面记录一点关于collections库的内容:

线性结构queue,stack

FIFO,LIFO

# Stack()创建一个新的空盏,不需要参数,返回一个空的盏

# push()添加一个元素在盏顶,它需要添加的元素,没有返回值

#pop()移除盏顶的值,不需要参数,返回盏顶的值,然后整个盏被修改

#peek()返回盏顶的值,但不移除,不需要参数,不会修改盏

#isEmpty()测试是否为空盏

#size()返回盏内元素的个数,不需要参数,返回一个整数。

简单总结一下

我学习python已经又一段时间了,也已经读过了很多的python相关书籍,中文的英文的,在写完这个文章之后发现,对类的学习还需要加强,面向对象的四个特点,继承(inheritance),多态(polymorphsim),封装(encapsulation)、抽象(abstraction),还需要再进一步的加深对类的学习,和对面向对象编程的理解。另外,要再继续再学一学python的标准库、第三方库,还有算法的学习。

数据分析要求的python编程能力没有那么的强,不过我在学习数据分析的时候最开始拿着书,很多东西并不懂,所以还是要从最基本的东西开始学习,懂一些套路,懂一些基本的流程,幸好经过了初级数据分析师的学习知道了很多知识。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值