-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathpython.py
More file actions
255 lines (165 loc) · 9.57 KB
/
python.py
File metadata and controls
255 lines (165 loc) · 9.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
'''==========================================================================================
Python Learning note
@date:2017.09.19
@author: stdEnable
廖雪峰Python教程 reading note
data:
1. 廖雪峰Python教程
2.
code: (note; question; think) @The end
plan:
1. 廖雪峰Python教程的学习,记录。
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
2.
log:
1. review & rebuild @2018.02.25
=========================================================================================='''
'''********************************************************************************************
1.《Python教程》廖雪峰
https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000
********************************************************************************************'''
# Python基础 ==================================================================================
# list
# list是一种有序的集合,可以随时添加和删除其中的元素。
# sample:
classmates = ['Michael', 'Bob', 'Tracy']
classmates.insert(1, 'Jack')
classmates.pop(1)
# tupe
# 另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改。
classmates = ('Michael', 'Bob', 'Tracy')
# !!! 只有1个元素的tuple定义时必须加一个逗号,,来消除歧义。
# dict
# Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。
# dict的key必须是不可变对象。
# 用Python写一个dict如下:
grade = {'xiaoming':95, 'lihua':'78', 'huangmeimei':83}
# 要删除一个key,用pop(key)方法,对应的value也会从dict中删除:
grade.pop('lihua')
'''
和list比较,dict有以下几个特点:
1.查找和插入的速度极快,不会随着key的增加而变慢;
2.需要占用大量的内存,内存浪费多。
而list相反:
1.查找和插入的时间随着元素的增加而增加;
2.占用空间小,浪费内存很少。
所以,dict是用空间来换取时间的一种方法。
'''
# set
# set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key(重复元素在set中自动被过滤:)。
# 要创建一个set,需要提供一个list作为输入集合:
s = set([1, 2, 3])
# 通过add(key)方法可以添加元素到set中:
s.add(2)
# 通过remove(key)方法可以删除元素:
s.remove(2)
# set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
# Python函数 ==================================================================================
# Python的函数返回多值其实就是返回一个tuple
# 函数参数
# 位置参数; 默认参数; 可变参数; 关键字参数; 命名关键字参数
# 默认参数:1. 必选参数在前,默认参数在后(定义默认参数要牢记一点:默认参数必须指向不变对象。)
# 2. 当函数有多个参数时,把变化大的参数放前面,变化小的参数放后面。变化小的参数就可以作为默认参数。
# 可变参数:定义可变参数和定义一个list或tuple参数相比,仅仅在参数前面加了一个*号。
# 在函数内部,参数numbers接收到的是一个tuple,因此,函数代码完全不变。
def calc(*numbers):
sum = 0
for n in numbers:
sum = sum + n * n
return sum
# 如果已经有一个list或者tuple,要调用一个可变参数:
nums = [1, 2, 3]
calc(*nums)
# 关键字参数:
# 关键字参数允许你传入0个或任意个含参数名的参数,这些关键字参数在函数内部自动组装为一个dict。请看示例:
def person(name, age, **kw):
print('name:', name, 'age:', age, 'other:', kw)
# 命名关键字参数:
# 对于关键字参数,函数的调用者可以传入任意不受限制的关键字参数。至于到底传入了哪些,就需要在函数内部通过kw检查。
# 仍以person()函数为例,我们希望检查是否有city和job参数:
def person(name, age, **kw):
if 'city' in kw:
# 有city参数
pass
if 'job' in kw:
# 有job参数
pass
print('name:', name, 'age:', age, 'other:', kw)
# 但是调用者仍可以传入不受限制的关键字参数:
person('Jack', 24, city='Beijing', addr='Chaoyang', zipcode=123456)
# 如果要限制关键字参数的名字,就可以用命名关键字参数,例如,只接收city和job作为关键字参数。这种方式定义的函数如下:
def person(name, age, *, city, job):
print(name, age, city, job)
# 如果函数定义中已经有了一个可变参数,后面跟着的命名关键字参数就不再需要一个特殊分隔符*了:
def person(name, age, *args, city, job):
print(name, age, args, city, job)
'''
要注意定义可变参数和关键字参数的语法:
*args是可变参数,args接收的是一个tuple;
**kw是关键字参数,kw接收的是一个dict。
以及调用函数时如何传入可变参数和关键字参数的语法:
可变参数既可以直接传入:func(1, 2, 3),又可以先组装list或tuple,再通过*args传入:func(*(1, 2, 3));
关键字参数既可以直接传入:func(a=1, b=2),又可以先组装dict,再通过**kw传入:func(**{'a': 1, 'b': 2})。
使用*args和**kw是Python的习惯写法,当然也可以用其他参数名,但最好使用习惯用法。
命名的关键字参数是为了限制调用者可以传入的参数名,同时可以提供默认值。
定义命名的关键字参数在没有可变参数的情况下不要忘了写分隔符*,否则定义的将是位置参数。
'''
# 高级特性 ====================================================================================
# 切片; 迭代; 列表生成式; 生成器; 迭代器
# 函数式编程 ==================================================================================
# 高阶函数 map/reduce filter sorted; 返回函数; 匿名函数; 装饰器; 偏函数;
map()
# map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
def f(x) :
return x*x
list(map(f, [2,3,4]))
reduce()
# reduce把一个函数作用在一个序列[x1, x2, x3, ...]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算
from functools import reduce
filter()
sorted()
# 模块 ========================================================================================
# 面向对象编程 ================================================================================
# 定义类:
class Student(object):
def __init__(self, name, score) :
self.name = name
self.score = score
def print_score(self):
print('%s : %s' % (self.name, self.score))
# 由于类可以起到模板的作用,因此,可以在创建实例的时候,把一些我们认为必须绑定的属性强制填写进去。
# 通过定义一个特殊的__init__方法,在创建实例的时候,就把name,score等属性绑上去。
# 如果要让内部属性不被外部访问,可以把属性的名称前加上两个下划线__,在Python中,实例的变量名如果以__开头,
# 就变成了一个私有变量(private),只有内部可以访问,外部不能访问
# 面向对象高级编程 ==================================================================================
# demo:
class Student(object):
def __init__(self, name, score):
self.name = name
self.score = score
def print_score(self):
print('%s: %s' % (self.name, self.score))
# 错误、调试和测试 ==================================================================================
# I/O编程 ===========================================================================================
# 进程和线程 ========================================================================================
# 正则表达式 ========================================================================================
# 常用内建模块 ======================================================================================
# 常用第三方模块 ====================================================================================
# 图形界面 ==========================================================================================
# 网络编程 ==========================================================================================
# TCP/IP简介; TCP编程; UDP编程.
# 电子邮件 ===========================================================================================
# SMTP发送邮件; POP3收取邮件.
# 访问数据库 =========================================================================================
# 使用SQLite; 使用MYSQL;
# Web开发 ============================================================================================
# 异步I/O ============================================================================================
# 实战 ===============================================================================================
'''********************************************************************************************
2.
********************************************************************************************'''
'''***********************************************
s
***********************************************'''
# 1.
# 2.