1 python特点
2 python使用缩进
3 多个语句在一行使用;分隔
4 注释为#,多行注释doc string()
5 cmd的pip安装
6 pip install selenium #安装
7 pip list #查看安装了哪些包
8 pip uninstall selenium #卸载
9 py -3 -m pip install selenium #python安装在python3.0上
10
11 打印
12 print("hello"," ","world");
13 name=input("输入你的名字");
14 print(name);
15
16 数据类型
17 整数 int
18 浮点数 float
19 布尔值 bool
20 空值 None
21 type{a} #查看a的变量类型
22
23 变量赋值(不区分单双引号)
24 a=100 #int
25 b="test" #字符串
26 x=y=z=1 #多重赋值
27 x,y,z=1,2,"str" #多元赋值
28 int(a);str(a); #类型转换
29
30 运算符
31 3 * 5
32 3 ** 2 #乘方
33 5 / 2
34 5%2
35 "hello"+"world"
36 10 // 3 ; #整除,返回值为帧整数部分;
37
38 注释:
39 单行注释#
40 多行注释
41 """
42 注释内容
43 """
44 转义
45 \
46 \n 换行
47 \也可以续行,表示没有输完
48
49 字符串
50 print("%d(x)是一个数字,%s(y)是一个字符串"%(x,y));
51 %d(data)打印数字
52 %s(string)打印字符串
53 如果无法确定种类种类则用%r
54 l=[1,2,3]
55 print("这个列表的内容是%r" % l )
56
57 字符串操作
58 #比如a="abc";b="cde"
59 + 字符串连接
60 * 字符串重复输出 a*2 ,输出aa
61 [] 索引,a[0]="a",a[-1]="c"
62 [ : ]
63 in
64 not in
65 r/R
66 % 格式字符串
67
68 字符串常见函数方法
69 L=['a','b','c'];
70 "".join(L) #拼接成abc
71 "_".join(L) #拼接成a_b_c
72 L="a,b,c"
73 L.split(",") #换成list类型,以,分割
74 str.endswith(obj,beg=0,end=len(string));
75
76 A="abcdefdasd1";
77 A.find('1');
78 "_".join(A); #输出'a_b_c_d_e_f_d_a_s_d_1'
79 len(A) #11
80 A.replace("a","A");#'AbcdefdAsd1'
81 A.split("a"); #['', 'bcdefd', 'sd1']
82 A.strip('a'); #左右各处理掉a字符,'bcdefdasd1'
83 A.startswith('a',0,len(A)); #true
84
85 列表list
86 赋值、索引
87 A[1][1]取索引为1的元素中的索引为1的元素
88 基本操作
89 切片,从左边开始取值
90 比如A=[1,2,3,4,5]
91 A[1:3] 表示取值为A[1],A[2]
92 A[x:y] 表示取值A[x]到A[y-1]这个范围内
93 A[0:-2]从最左边取值到最右倒数第二个但不包含这个数,这里就是[1, 2, 3, 4]
94
95 list函数
96 len(list)
97 max(list)/min(list)
98 list(seq) 元祖转换为列表
99
100 list方法
101 list.append(obj); 列表末尾添加新的对象
102 list.count(obj); 对指定元素计数
103 list.extend(seq); 插入序列类的东西到末尾,比如字符串,list
104 list.index(obj); 找到某个元素的位置
105 list.insert(index,obj); 在指定位置插入
106 list.pop(index); 删除某元素
107 list.remove(obj); 删除某元素
108 list.reverse(); 反序
109 list.sort(); 排序
110 list.clear(); 清空
111 list.copy(); 建立副本
112 list.strip() 方法用于移除字符串头尾指定的字符(默认为空格)
113
114
115 元祖tuple
116 特色:
117 1、和list相似,最大的不同元祖是一种只读且不可读的数据结构
118 2、不可替代元祖中的所有元素,至刻度不可更变
119 3、list与tuple可以相互转换,tuple(list)、list(tuple)
120
121 赋值:
122 h=(2,[3,4],(23112,2)); #多维列表
123 h=(1,) #一个元素时必须要打逗号,因为h=(1)与h=1一致。
124
125 字典:Dict
126 a={'x':3, 'y':4, 'z':5 }
127 #x就是key不能为数字;3表示value值;和json格式相似
128 a['xx']=333; #表示又插入一个键为'xx',值为'333'的元素;
129 #结果是a字典就是{'x': 3, 'y': 4, 'z': 5, 'xxx': 2333}
130
131
132 字典的函数方法:
133 dict.clear()
134 dict.copy();
135 dict.get(key,None); #返回指定键的值,若没有返回"None"
136 key in dict
137 dict.items() #以列表返回可遍历的(键,值)元祖数组
138 dict.keys() #以列表返回一个字典所有的键
139 dict.setdefault(key,None)#和get()相似,但如果键不存在字典中,会添加一个key键,值为None
140 dict.update(dict2) #把字典dict2的键/值对更新到dict里
141 dict.values() #返回字典中所有的值;
142 dict.pop(key,None) #删除键Key对应的值,返回被删除的值,key值不存在返回None。如果Key不存在,又没有默认值,则报错。
143
144 条件语句
145 if y>0:
146 print("y>0")
147 elif y==0:
148 print("y==0")
149 else:
150 print("y<0")
151 ################
152 布尔表现式---逻辑操作符and、or、not、in、not in
153 a=2;b=4;c=6
154 if b>=a and b<=c:
155 print("b is between a and c")
156
157 if not (b<a or b>c):
158 print("b is still between a and c")
159 ######################
160 while语句
161 i=5
162 while i>0:
163 print("ss")
164 i=i-1
165
166 ######################
167 For语句
168 for i in [3,4,10,25]:
169 print(i)
170
171 for i in "helloworld":
172 print(i)
173
174 for i in range(10): #i从0取到9
175 print(i)
176
177 A=[]
178 for j in [3,4,5,6]:
179 A.append(j**2)
180
181
182 range(1,10) #从1取到10
183 range(1,10,2) #从1取到10,每隔2取一次值
184
185
186 #######################
187 控制流终止
188 continue
189 break
190
191
192
193
194
195
196 ###############################
197 函数
198 def语句
199 def 函数名(参数1,参数2,参数3)
200 语句块
201
202 def divide(a,b):
203 q=a/b
204 r=a-q*b
205 return q,r
206
207 #调用
208 x,y=divide(42,5) #x=8,y=2
209 x=divide(42,5) #x=(8,2)是tuple元祖
210
211 def add(a,b=2): #a为位置参数,b为默认参数、默认取值为2。默认参数在位置参数之后
212 s=a+b
213 return s
214
215 def fenshu(name,socre=90):
216 print('%s的分数为%d'%(name,score))
217
218
219 #调用分数
220 fenshu('张三',)
221 t=('李四',80)
222 fenshu(*t)
223
224 ###############
225 #1、可变参数
226 def func(*a): #如果输入为1,23,4,4,5;那么a=(1,23,4,4,5)元祖
227 sum=0
228 for n in a:
229 sum=sum+n
230 return sum
231
232 def fenshu(name,socre=90):
233 print('%s的分数为%d'%(name,score))
234
235
236 #2、可变参数
237 fenshu('张三')
238 t=('李四',80)
239 fenshu(*t)
240
241
242 #################################################
243 关键字参数
244 def func(**kw)
245 可变参数允许传入0或者任意个参数,这些可变参数在函数调用时自动组装为一个tuple。而关键字参数允许我传入0~任意个含参数名的参数,这写关键字参数在内自动组装为一个dict。与可变参数相同,需要使用dict的操作方法来操作dict
246
247 在调用函数时,我们可以将参数组装成dict,通过func(**dict)的方式传参
248 def func(name,age=20):
249 print("%s age is %d"%(name,age))
250
251 p={'name':'bob','age':27}
252 func(**p)
253
254 参数组合
255 顺序为位置参数、默认参数、可变参数和关键字参数,形式:
256 def func(para,para2=None,*agrs,**kw)
257 #################################################
258 类、对象
259 class Person():
260 def __init__(self,name,age): #初始化,绑定实例属性,特殊的方法,类似于java的构造函数,第一个参数必须是self
261 self.name=name
262 self.age=age
263 1、继承
264 class Count():
265 def __init__(self,a,b): #初始化类的属性
266 self.a=a
267 self.b=b
268 def add(self): #类中的方法,第一个参数必须是self
269 return self.a+self.b
270
271 count = Count(3,5); #实例化对象,是否传参取决于__init__
272 count.add(); #调用对象的方法
273
274 class Father(): #表示无继承父类,或者说这是继承基类
275 def add(self,a,b):
276 return a+b
277
278
279 class Son(Father):
280 def div(self,a,b):
281 return a-b
282 >>> son=Son(); #实例化对象
283 >>> son.add(3,5)
284 >>> son.div(3,5)
285
286 ##########################################################
287 异常
288 try:
289 open("abc.txt",'r')
290 except IOError:
291 print "异常了!"
292
293 try:
294 print aa
295 except NameError:
296 print "这是一个 name 异常!"
297
298
299 try:
300 open("abc.txt",'r')
301 print aa
302 except BaseException:
303 print "异常了!"
304 所有的异常类有了新的基类 BaseException,Exception 同样也继承BaseException,所以我们也可以使用 BaseException 来接收所有的异常。
305
306 try:
307 print(s)
308 except NameError:
309 print("异常")
310 finally:
311 print("没有异常") #finally如何都都会被执行
312
313 try:
314 print(s)
315 except NameError:
316 print("异常")
317 else:
318 print("没有异常") #try正确才会执行
319 ###读取文件#######################################################
320 #coding=utf-8
321 import time
322
323 files =open('C:/Users/Lee/Desktop/test01.txt','r')
324 try:
325 # print(str)
326 for l in files:
327 print(l)
328 # time.sleep(1)
329 finally:
330 #files.close()
331 print ('Cleaning up ...closed the file')
332 #######################################
333
334
335
336 ######################################
337
338 引入包
339 import time
340 print(time.ctime())
341
342 引入自己写的模块
343
344
345 ##########################导入写的模块的路径
346 import sys
347 sys.path.append('C:\\test\\WorkSpace_Python\\Learn0904')
348 print(sys.path)
349 print(sys)
350
351
352 ###################################
353 open/文件操作
354 f=open('/tmp/hello','w')
355
356 #open(路径+文件名,读写模式)
357
358 #读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式
359 读写模式的类型有:
360
361 rU 或 Ua 以读方式打开, 同时提供通用换行符支持 (PEP 278)
362 w 以写方式打开,
363 a 以追加模式打开 (从 EOF 开始, 必要时创建新文件)
364 r+ 以读写模式打开
365 w+ 以读写模式打开 (参见 w )
366 a+ 以读写模式打开 (参见 a )
367 rb 以二进制读模式打开
368 wb 以二进制写模式打开 (参见 w )
369 ab 以二进制追加模式打开 (参见 a )
370 rb+ 以二进制读写模式打开 (参见 r+ )
371 wb+ 以二进制读写模式打开 (参见 w+ )
372 ab+ 以二进制读写模式打开 (参见 a+ )
373
374
375 #举例:读取文件
376 f=open('C:/Users/Lee/Desktop/123.csv','r+')
377 str=f.readlines()
378
379 for i in str:
380 print(i)
381 f.close()
382
383 #举例:读取csv文件
384 import csv
385 file1=open('C:/Users/Lee/Desktop/actual.csv','r+')
386 csv_reader=csv.reader(file1)
387 print(type(csv_reader))
388 for row in csv_reader:
389 print(type(row))
390 print(row[1])
391 file1.close()
392
393 #写入文件
394 f=open('C:/Users/Lee/Desktop/111.csv','a+')
395 num=[1,2,3,4,5]
396 char=['a','b','c','d','e']
397
398 l=[]
399 for i in range(len(num)):
400 m=str(num[i])+','+char[i]
401 l.append(m)
402 f.write(str(l)+'\n')
403 f.close()
404
405 #写入csv文件,这里的row_all是获取到的数据库的内容,为元祖
406 l=list(row_all)
407 f=open('D:/123.csv','a+',newline='')
408 writer=csv.writer(f)
409 num=len(l)
410 for i in range(num):
411 writer.writerow(l[i])
412 f.close()
413
414
415 #####################################python发送邮件
416 #coding=utf-8
417 import smtplib
418 from email.mime.text import MIMEText
419 from email.header import Header
420
421 #发送邮箱
422 sender='lihujun101@163.com'
423 #接受邮箱
424 receiver=['316947664@qq.com']
425
426 #发送主题
427 subject='测试'
428 #发送邮箱的服务器地址
429 smtpserver='smtp.163.com'
430 #发送邮箱用户/密码
431 user='lihujun101@163.com'
432 pwd='li1992hujun'
433
434 #邮件正文
435 msg=MIMEText('<html><h1>你好!!!'
436 '</h1><a href="http://baidu.com">这是一个链接</a></html>','html','utf-8')
437 msg['From']='李胡军'#可以写出来表示发件人名字
438 msg['To']='316947664@qq.com'
439 msg['Subject']=Header(subject,'utf-8')
440
441 smtpObj=smtplib.SMTP(smtpserver,25)
442
443 smtpObj.login(user,pwd)
444 smtpObj.sendmail(sender,receiver,msg.as_string())
445
446 ########################################################################
447 ###带附件发送邮件
448 #coding=utf-8
449 import smtplib
450 from email.mime.multipart import MIMEMultipart
451 from email.mime.text import MIMEText
452 from email.header import Header
453
454 #发送邮箱
455 sender='lihujun101@163.com'
456 #接受邮箱
457 receiver=['316947664@qq.com']
458
459 #发送主题
460 subject='测试'
461 #发送邮箱的服务器地址
462 smtpserver='smtp.163.com'
463 #发送邮箱用户/密码
464 user='lihujun101@163.com'
465 pwd='li1992hujun'
466
467 #邮件正文
468 msg=MIMEMultipart()
469 msg.attach(MIMEText('<html><h1>你好!!!'
470 '</h1><a href="http://baidu.com">这是一个链接</a></html>','html','utf-8'))
471
472 msg['From']='李胡军'#可以写出来表示发件人名字
473 msg['Subject']=Header(subject,'utf-8')
474
475
476 #附件
477 fj='C:\\Windows\\addins\\FXSEXT.ecf'
478 att=MIMEText(open(fj,'rb').read(),'base64','utf-8')
479 att["Content-Type"]= 'application/octet-stream'
480 att['Content-Disposition']='attachment; filename="test"'
481 msg.attach(att)
482
483 #发送
484 smtpObj=smtplib.SMTP(smtpserver,25)
485 smtpObj.login(user,pwd)
486 smtpObj.sendmail(sender,receiver,msg.as_string())
487
488 ###################################################################################
489
490
491
492
493
494 #####lambda函数
495 f=lambda x:x*2
496 '''
497 用 lambda 来声明匿名函数,冒号(:)前面 x 表示入参,冒号后面 x*2 表示返回值。lambda 和普通的函数相比,省去了函数名称,“匿名函数”也是由此而来。
498 '''
499 等价于
500 def f(x):
501 return x*2
502
503
504 #######################################取出文件夹中最新的文件
505 #coding=utf-8
506 import os
507
508 #定义文件目录
509 lists=os.listdir('D:\\123')
510
511 #按时间排序
512 lists.sort(key=lambda fn:os.path.getmtime('D:\\123\\'+fn))
513
514 print('最新文件为:'+lists[-1])
515 lists.sort()
516 print(os.path.getmtime('D:\\123\\'+lists[-1]))
517 print(lists)
518
519 ##########################################################
520 from urllib import request
521
522 with request.urlopen('https://api.douban.com/v2/book/2129650') as f:
523 data=f.read()
524 print('状态:',f.status,f.reason)
525 for k ,j in f.getheaders():
526 print('%s %s'%(k,j))
527 print('数据:',data.decode('utf-8'))
528
529 req=request.Request('http://www.douban.com/')
530 req.add_header('User-Agent', 'Mozilla/6.0 (iPhone; CPU iPhone OS 8_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) Version/8.0 Mobile/10A5376e Safari/8536.25')
531 with request.urlopen(req) as m:
532 print('状态1:',m.status,m.reason)
533 for k,j in m.getheaders():
534 print('%s :%s' %(k,j))
535 print('数据1:',data.decode('utf-8'))
536
537
538 可以直接作用于for循环的数据类型有以下几种:
539 一类是集合数据类型,如list、tuple、dict、set、str等;
540 一类是generator,包括生成器和带yield的generator function。
541 这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
542
543 生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。
544 可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator。
545 可以使用isinstance()判断一个对象是否是Iterator对象:
546
547
548 map函数/refuce函数/filter函数
549 >>>list(map(str, [1, 2, 3, 4, 5, 6, 7, 8, 9]))
550 ['1', '2', '3', '4', '5', '6', '7', '8', '9']
551
552 reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
553
554 def is_odd(n):
555 return n % 2 == 1
556
557 list(filter(is_odd, [1, 2, 4, 5, 6, 9, 10, 15]))
558 # 结果: [1, 5, 9, 15]
559
560 >>> sorted([36, 5, -12, 9, -21], key=abs)
561 [5, 9, -12, -21, 36]
562
563
564 列表生成式:
565 >>> [x * x for x in range(1, 11)]
566 [1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
567
568 等价于:
569 >>> L = []
570 >>> for x in range(1, 11):
571 ... L.append(x * x)
572 ...
573 >>> L
574
575
576
577 闭包:相关参数和变量都保存在返回的函数中,这种称为“闭包(Closure)”
578 返回闭包时牢记的一点就是:返回函数不要引用任何循环变量,或者后续会发生变化的变量。
579
580
581 匿名函数
582 lambda x: x * x
583 等价于
584 def f(x):
585 return x * x
586
587
588
589 装饰器:
590 这种在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator)。
591
592
593 Python作用域:
594 1、正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等
595 2、类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如上面的__author__,__name__就是特殊变量,hello模块定义的文档注释也可以用特殊变量__doc__访问,我们自己的变量一般不要用这种变量名;
596 3、类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
597 之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。
598
599
600 获取对象信息:
601 1、使用type()判断对象类型
602 2、使用isinstance('aaa',str)判断对象类型
603 3、使用dir()获得一个对象的所有属性和方法,可以使用dir()函数,它返回一个包含字符串的list
604 >>> type(123)
605 <class 'int'>
606 >>> type('str')
607 <class 'str'>
608 >>> type(None)
609 <type(None) 'NoneType'>
610 >>> isinstance([1, 2, 3], (list, tuple))
611 True
612 >>> hasattr(obj, 'x') # 有属性'x'吗?
613 True
614 >>> obj.x
615 9
616 >>> hasattr(obj, 'y') # 有属性'y'吗?
617 False
618 >>> setattr(obj, 'y', 19) # 设置一个属性'y'
619 >>> hasattr(obj, 'y') # 有属性'y'吗?
620 True
621 >>> getattr(obj, 'y') # 获取属性'y'
622 19
623 >>> obj.y # 获取属性'y'
624 19
625
626
627
628 给一个实例绑绑定方法,但是对另外的实例无效
629 >>> def set_age(self, age): # 定义一个函数作为实例方法
630 ... self.age = age
631 ...
632 >>> from types import MethodType
633 >>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
634 >>> s.set_age(25) # 调用实例方法
635 >>> s.age # 测试结果
636 25
637