一周知识点
1 多重继承
- 多重继承是编程语言中的概念:①一个类可以继承另外一个类,而另外一个类又可以继承别的类,比如A类继承B类,而B类又可以继承C类。②一个类可以从多个类继承,比如A类继承了B类,同时A类又继承了C类。
from abc import ABCMeta,abstractmethod
class Father(object):
def __init__(self,name):
self._name = name
def drink(self):
print(self._name + '正在喝爽歪歪')
def smoking(self):
print(self._name + '正在抽烟呢')
class Monk(object,metaclass=ABCMeta): #将此类写成抽象类
def __init__(self,nickname):
self._nickname = nickname
@abstractmethod
#将此种方法写成抽象方法 若子类继承此类 则子类必须改写此方法
def eat_vegetable(self):
print(self._nickname + '正在吃东西')
@abstractmethod
def chant(self):
print(self._nickname + '正在念经')
class Musician(object,metaclass=ABCMeta):
def __init__(self,art_name):
self._art_name = art_name
@abstractmethod
def play_piano(self):
print(self._art_name + '正在弹钢琴')
@abstractmethod
def drink(self):
print(self._art_name + '正在喝茶')
#### 多重继承 #### (尽量不要随意的使用多重继承,如果无法避免,将后面的父类写成抽象类,在子类中进行重写)
class Son(Father,Monk,Musician): # 此处的继承顺序切记不要写错
def __init__(self,name,nickname,art_name): #按继承类的顺序写继承属性
Father.__init__(self,name)
self._nickname = nickname
self._art_name = art_name
def play_piano(self):
print(self._art_name + '正在弹钢琴')
def eat_vegetable(self):
print(self._nickname + '正在吃东西')
def chant(self):
print(self._nickname + '正在念经')
def drink(self):
print(self._art_name + '正在喝茶')
def main():
son = Son('王大锤','智障大师','贝多芬')
son.drink() ## 如果多个父类都含有同一函数 谁先继承就执行谁
# 如果后面具有重写父类 则只有子类的生效
Father.drink(son)
son.smoking()
if __name__ == '__main__':
main()
## 棱形继承:如果一个类有多个父类(他们有共同的爷爷类),那个在搜索属性和方法时搜索的依据是广度优先搜索(C3算法)
## 这个是Python3中的一个改进,在此之前搜索的算法是深度优先搜索(DFS)
class A(object):
def foo(self):
print('A\'s foo')
class B(A):
pass
class C(A):
def foo(self):
print('C\'s foo')
class D(B,C):
pass
def jc():
obj = D()
obj.foo()
D.foo(obj)
C.foo(obj)
B.foo(obj)
A.foo(obj)
if __name__ == '__main__':
jc()
2 正则表达式
正则表达式,又称规则表达式,英文名为Regular Expression,在代码中常简写为regex、regexp或RE,是计算机科学的一个概念。正则表通常被用来检索、替换那些符合某个模式(规则)的文本。
正则表达式是对字符串(包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为”元字符”))操作的一种逻辑公式,就是用事先定义好的一些特定字符、及这些特定字符的组合,组成一个”规则字符串”,这个”规则字符串”用来表达对字符串的一种过滤逻辑。正则表达式是一种文本模式,模式描述在搜索文本时要匹配的一个或多个字符串
2.1 元字符
. 匹配除换行符以外的任意字符
\w 匹配字母或数字或下划线或汉字
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
^ 匹配字符串的开始
$ 匹配字符串的结束"""
重复
* 重复零次或更多次
+ 重复一次或更多次
? 重复零次或一次
{n} 重复n次
{n,} 重复n次或更多次
{n,m} 重复n到m次"""
2.2 正则表达式实例分析
import re
from random import randint
def main():
pattern = re.compile (r'1[345789]\d{9}')
sentence = '我的手机号是13512346789不是13300998765,舒玲的手机号是13548068412不是110'
mylist = pattern.findall (sentence)
print (mylist)
# iter -iterator -迭代器
for temp in pattern.finditer (sentence):
print (temp)
print (temp.group ())
print (temp.span ())
m = pattern.search (sentence)
while m:
print (m.group ())
m = pattern.search (sentence, m.span ()[1])
if __name__ == '__main__':
main ()
def th():
words = '马化我透你娘嘞草你爹老篮子的'
mm = re.sub ('[操艹草肏]|[马化腾]|shit', '*', words, flags=re.IGNORECASE)
print (mm)
sentence1 = 'You go your way,I will go mine!'
my_list = re.split (r'[\s,!]', sentence1)
print (my_list)
if __name__ == '__main__':
th ()
3 多线程与多进程
- 每个正在系统上运行的程序都是一个进程。每个进程包含一到多个线程。进程也可能是整个程序或者是部分程序的动态执行。线程是一组指令的集合,或者是程序的特殊段,它可以在程序里独立执行。也可以把它理解为代码运行的上下文。所以线程基本上是轻量级的进程,它负责在单个程序里执行多任务。通常由操作系统负责多个线程的调度和执行。
- 线程是程序中一个单一的顺序控制流程.在单个程序中同时运行多个线程完成不同的工作,称为多线程。
- 线程和进程的区别在于,子进程和父进程有不同的代码和数据空间,而多个线程则共享数据空间,每个线程有自己的执行堆栈和程序计数器为其执行上下文.多线程主要是为了节约CPU时间,发挥利用,根据具体情况而定. 线程的运行中需要使用计算机的内存资源和CPU。
# 使用多线程的原因 # process 进程 thread 线程
# 1 如果一个任务执行时间很长,这时可以分解为多进程或者多线程,提升任务执行效率,缩短执行时间
# 2 提升用户体验
import time
from multiprocessing import Process
import os
def output():
while True:
print ('Pong', end='', flush=True) # flush =True 去掉系统缓存
time.sleep (1)
def main():
print (os.getpid ())
Process (target=output).start ()
while True:
print ('Ping', end='', flush=True)
time.sleep (1)
if __name__ == '__main__':
main ()
import subprocess
def mian():
subprocess.call ('calc')
subprocess.call ('notepad')
if __name__ == '__main__':
mian ()
from threading import Thread
## 创建线程的两种方式
# 1 直接创建Thread对象并通过target参数指定线程启动后要执行的任务
# 2 继承Thread自定义线程 通过重写run方法指定线程启动后执行的任务
count = 0
def out(string):
global count
inner_count = 0
while count < 10:
print (string, end='', flush=True)
count += 1
inner_count += 1
print ('\n%s打印了%d次\n' % (string, inner_count))
def xc():
# 守护线程 - 不值得保留的线程 - 其他线程都执行完毕 守护线程自动结束
# daemon=True - 将线程设置为守护线程
t1 = Thread (target=out, args=('ping',))
t1.start ()
t2 = Thread (target=out, args=('pong',))
if __name__ == '__main__':
xc ()
4 服务器与客户端
# 计算机网络- 多台独立自主的计算机互联而成的计算机系统、能够交互资源
from socket import socket,AF_INET,SOCK_STREAM
import datetime
# 服务器
def main():
# 创建一个基于TCP协议的套接字对象
# 因为我们做的事应用级的产品或服务所以可以利用现有的传输服务来实现数据传输
serve = socket(AF_INET,SOCK_STREAM)
# 绑定IP地址(网络上的主机的身份标识)和端口(用来区分不同服务的IP地址的扩展)
serve.bind(('10.7.189.60',5678)) #serve.bind(('127.0.0.1',6789)) 使用 本机ip
# 开始监听客户端的连接
serve.listen(512)
print('服务器已经启动正在监听...')
while True:
# 通过accept方法接收客户端的连接
# accept方法是一个阻塞式的方法,如果没有客户端连上来 那么accept方法就会让代码阻塞,直到有客户端连接才返回
# 元组中的第二个值又是一个元组 其中有客户端的IP地址和客户端的端口
client,addr = serve.accept()
print(addr,'连接成功' )
date = datetime.datetime.now()
client.send('sb'.encode('UTF-8'))
client.close()
if __name__ == '__main__':
main()
### netstat -na
# 客户端
def main():
client = socket()
client.connect(('10.7.189.118',6789))
data = client.recv(512)
print(type(data))
print(data.decode('utf-8'))
if __name__ == '__main__':
main()
def mian():
clinet = socket()
clinet.connect(('10.7.189.135',6789))
while True:
fs = input('请:')
clinet.send(fs.encode('utf-8'))
sd = clinet.recv (512)
print(sd.decode('utf-8'))
if __name__ == '__main__':
mian()
# 服务器
def main():
class ClientHandler (Thread):
def __init__(self, client):
super ().__init__ ()
self._client = client
def run(self):
try:
while True:
try:
data = self._client.recv (1024)
if data.decode ('utf-8') == 'byebye':
clients.remove(self._client)
self._client.close()
break
else:
for client in clients:
client.send (data)
except Exception as e:
print(e)
clients.remove(self._client)
break
except Exception as e:
print(e)
server = socket()
# Python命令行参数 -sys.argv
server.bind(('10.7.189.60',2345 ))
server.listen(512)
clients =[]
while True:
curr_client,add = server.accept() # 取连接到本服务器的
print (addr[0], '连接到服务器.')
clients.append(curr_client) # 将所有连接到本服务器的客户端添加到列表里
ClientHandler(curr_client).start()
if __name__ == '__main__':
main()
# 客户端
def kehuduan():
class RefreshScreenThread (Thread):
def __init__(self, client):
super ().__init__ ()
self._client = client
def run(self):
while running:
data =self._client.recv(1024)
print(data.decode('utf-8'))
nickname = input ('请输入你的昵称:')
my_client = socket()
my_client.connect(('10.7.189.81',12345))
running = True
RefreshScreenThread(my_client).start()
while running:
content = input('请开腔:')
if content == 'byebye':
my_client.send(content.encode('utf-8'))
running=False
else:
msg = nickname +':' + content
my_client.send(msg.encode('utf-8'))
if __name__ == '__main__':
kehuduan()
5 发送与接收文件
from email.mime.multipart import MIMEMultipart
from email.mime.text import MIMEText
from smtplib import SMTP
from socket import socket,SOCK_DGRAM
# 发送端
def main():
sender = socket(type=SOCK_DGRAM)
with open('mm.jpg','rb') as f:
data=f.read()
data.len =len(data)
total =0
while total <data.len:
sender.sendto(data[total:total+1023],('10.7.189.118',9876))
total+=1024
sender.sendto(data,'10.7.189.118',9786)
if __name__ == '__main__':
main()
# 接收端
def jsd():
receiver=socket(type=SOCK_DGRAM)
receiver.bind(('10.7.189.118',9876))
data=bytes()
while True:
seg,addr=receiver.recvfrom(1024)
data+=seg
if not seg:
break
with open('hello.jpg','wb') as f:
f.write(data)
print('图片已接收')
if __name__ == '__main__':
jsd()
def main():
sender = SMTP('smtp.126.com')
sender.login('cd_ios_1605@126.com', '1qaz2wsx')
message = MIMEMultipart()
message['From'] = '骆昊'
message['To'] = '瓜西西'
message['Cc'] = 'shuling@1000phone.com'
message['Subject'] = '请查收附件中的数据'
text_msg = MIMEText('附件中有本月关键数据请查收!', 'plain', 'utf-8')
message.attach(text_msg)
att2 = MIMEText(open('hello.xlsx', 'rb').read(), 'base64', 'utf-8')
att2['Content-Type'] = 'application/vnd.ms-excel'
att2['Content-Disposition'] = 'attachment; filename=foo.xlsx'
message.attach(att2)
sender.sendmail('cd_ios_1605@126.com',
['957658@qq.com', 'jackfrued@126.com'],
message.as_string())
print('发送完成!')
if __name__ == '__main__':
main()
import urllib.parse
import http.client
import json
host = "106.ihuyi.com"
sms_send_uri = "/webservice/sms.php?method=Submit"
params = urllib.parse.urlencode({
'account': '',
'password': '',
'content': '您的验证码是:147258。请不要把验证码泄露给其他人。',
'mobile': '18281599458',
'format': 'json'
})
print(params)
headers = {'Content-type': 'application/x-www-form-urlencoded', 'Accept': 'text/plain'}
conn = http.client.HTTPConnection(host, port=80, timeout=10)
conn.request('POST', sms_send_uri, params, headers)
response = conn.getresponse()
response_str = response.read()
jsonstr = response_str.decode('utf-8')
print(json.loads(jsonstr))
conn.close()
from threading import Thread
import json
import requests
class DownloadTask(Thread):
def __init__(self,url):
super().__init__()
self._url = url
def run(self):
resp = requests.get(self._url)
filename =self._url[self._url.rfind('/')+1:]
try:
with open(filename,'wb') as fs:
fs.write(resp.content)
except IOError as e:
print(e)
def main():
resp = requests.get ('http://api.tianapi.com/meinv/?key=823bf1f177a7b23d804eac748faac7d0&num=10')
mydict = json.loads (resp.text)
threads = []
for tempdict in mydict['newliast']:
pic_url = tempdict['picUrl']
thread = DownloadTask (pic_url)
thread.start ()
threads.append (thread)
for thread in threads:
thread.join ()
if __name__ == '__main__':
main()
6 个人心得与体会
- 不知不觉中学习已经过去了一个月,而且这周也进行了阶段学习测评,本来感觉自己什么都不懂,在测评中发现自己还是学会了不少东西,很开心哈哈哈哈。不过这还不够,因为有些稍微复杂一点的自己都不会了,而且学习速度也越来越快,要在这上面花更多时间才好呢,本周学习的内容很多还没理解,需要自己挤时间去多消化。我始终相信‘只要功夫深,铁杵磨成针’这句话,相信只要花更多的功夫,我一定可以学的更好的!