=================Python基礎知識相關筆記=====================python
import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET: internet網絡;SOCK_STREAM: TCP 流式協議
phone.bind(('127.0.0.1', 8081)) # 至關於插電話卡
phone.listen(5) # 至關於開機
print('starting')
while True: # accept 鏈接循環
conn, address = phone.accept() # 至關於接聽電話
print('client is coming ', address)
while True: # 與conn的通信循環
try: # 針對windows下,當client斷掉以後,會拋異常,須要加一個try except
client_message = conn.recv(1024) # 讀取客服端發過來的消息,收消息
if not client_message: break # 在linux機器上,不會識別到client斷掉的消息,會不斷的收空消息。此時須要加一個判斷。
conn.send(client_message.upper()) # 回消息
except Exception: # 捕捉通信終端異常
break
conn.close() # 掛電話
phone.close() # 關機
import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8083)) # 鏈接服務器的地址
while True:
msg = input('>>>:').strip()
if not msg: continue # 防止客戶端發空,當是空消息時,繼續輸入
phone.send(msg.encode('utf-8')) # 不能直接發字符串,須要發二進制的形式的文件
back_message = phone.recv(1024) # 接受返回的消息
print(back_message.decode('utf-8'))
phone.close()
mport socket
import subprocess
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET: internet網絡;SOCK_STREAM: TCP 流式協議
phone.bind(('127.0.0.1', 8082))
phone.listen(5)
print('starting')
while True:
conn, address = phone.accept()
print('client is coming ', address)
while True:
try:
cmd = conn.recv(1024)
print('receive')
if not cmd: break
res = subprocess.Popen(cmd.decode('utf-8'),shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
err = res.stderr.read()
if err:
cmd_res = err
print('error')
else:
cmd_res = res.stdout.read()
print('wokao cmd_res', cmd_res)
conn.send(cmd_res)
except Exception:
break
conn.close()
phone.close()
import socket
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8082)) # 鏈接服務器的地址
while True:
cmd = input('>>>:').strip()
if not cmd: continue # 防止客戶端發空,當是空消息時,繼續輸入
phone.send(cmd.encode('utf-8')) # 不能直接發字符串,須要發二進制的形式的文件
cmd_res = phone.recv(1024) # 接受返回的消息
print(cmd_res.decode('utf-8'))
phone.close()
import socket
import subprocess
import struct
import json
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # AF_INET: internet網絡;SOCK_STREAM: TCP 流式協議
phone.bind(('127.0.0.1', 8082))
phone.listen(5)
print('starting')
while True:
conn, address = phone.accept()
print('client is coming ', address)
while True:
try:
cmd = conn.recv(1024)
print('receive')
if not cmd: break
res = subprocess.Popen(cmd.decode('utf-8'),shell=True,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
err = res.stderr.read()
if err:
cmd_res = err
print('error')
else:
cmd_res = res.stdout.read()
print('wokao cmd_res', cmd_res)
# conn.send(struct.pack('i', len(cmd_res))) # 先發報頭,報頭 i 格式,會生成 int 類型的4個字節的報頭
head_dic = {'filename': None, 'hash': None, 'total_size': len(cmd_res)}
head_json = json.dumps(head_dic)
head_bytes = head_json.encode('utf-8')
conn.send(struct.pack('i', len(head_bytes))) # 先發送報頭的長度
conn.send(head_bytes) # 再發送報頭的bytes
conn.send(cmd_res) # 最後發送真實是數據
except Exception:
break
conn.close()
phone.close()
import socket
import struct
import json
phone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
phone.connect(('127.0.0.1', 8082)) # 鏈接服務器的地址
while True:
cmd = input('>>>:').strip()
if not cmd: continue # 防止客戶端發空,當是空消息時,繼續輸入
phone.send(cmd.encode('utf-8')) # 不能直接發字符串,須要發二進制的形式的文件
# 先收報頭的長度
head_struct = phone.recv(4)
head_len = struct.unpack('i', head_struct)[0]
# 再收報頭的bytes
head_bytes = phone.recv(head_len)
head_json = head_bytes.decode('utf-8')
head_dic = json.loads(head_json)
print(head_dic)
# 最後根據報頭裏面的詳細信息讀取真實數據
total_size = head_dic['total_size']
receive_size = 0
data = b''
while receive_size < total_size:
receive_data = phone.recv(1024)
data += receive_data
receive_size += len(receive_data)
print(data.decode('utf-8'))
phone.close()
import ftpclient
f1 = ftpclient.FtpClient('192.168.1.150')
if hasattr(f1, 'get'): # 經過反射來判斷 f1 中是否有get方法,若是有該方法則執行該方法
func = getattr(f1, 'get') # 獲得 f1 的 get方法,而後執行它
func()
else:
print('沒有該方法,執行其餘操做')
class Ftpclient:
def __init__(self,host):
self.host = host
print('ready to connecting')
def run(self):
while True:
inp = input('---->請輸入命令').strip()
inp_l = inp.split()
if hasattr(self, inp_l[0]):
func = getattr(self, inp_l[0])
func(inp_l)
else:
print('沒有該命令')
def get(self, arg):
print('downloading file ', arg[1])
def ls(self, arg):
print('list the file', arg)
f = Ftpclient('192.168.1.1')
f.run()
# 使用遞歸的方式來生成斐波那契數列:一、一、二、三、五、八、1三、2一、34。。。。。
# 格式如此:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*)
# 數列從第3項開始,每一項都等於前兩項之和。
def recur_fibo(n):
if n <=1 :
return n
else:
return (recur_fibo(n-1) + recur_fibo(n-2))
nterms = int(input('請輸出幾項'))
if nterms <= 0:
print('請輸入正數')
else:
print('開始輸出斐波那契數列')
for i in range(1,nterms+1):
print(recur_fibo(i))
list_a = [1,99,88,77,49,102,53,4,9,80,89]
list_sorted = sorted(list_a)
def search(find_num, li):
if len(li) == 0:
print('not exits')
return
mid_index = len(li) // 2
mid_num = li[mid_index]
if find_num > mid_num:
li = li[mid_index+1:] # 給li 從新賦值一次。
print(li)
search(find_num, li)
elif find_num < mid_num:
li = li[:mid_index]
print(li)
search(find_num,li)
else:
print('find it')
search(0,list_sorted)
def func(x,y):
return x + y
# 等同於 func
lambda x, y: x+y
#
salary = {
'egon': 3000,
'alex': 100000,
'better': 20000000,
'hello': 2000
}
print(max(salary)) # 默認按照key值進行比較,最大的值輸出來
print(max(salary, key=lambda x: salary[x])) # 按照 value值進行排序,將最大的 key 值輸出來
print(min(salary, key=lambda x: salary[x]))
print(sorted(salary, key=lambda x: salary[x])) # 按照value值從小到大進行排序,而後輸出 key值。
print(sorted(salary, key=lambda x: salary[x], reverse=True)) # 按照value值從大到小進行排序,而後輸出 key值。
# res = zip(salary.values(), salary.keys()) # 生成元組對象。
# print(list(res))
# map 映射函數,列表+一個 SB 後綴
#
l = ['alex', 'wupeiqi', 'yuanhao']
g = map(lambda x: x + 'SB', l)
print(list(g))
# num元素各自平方 一下
num = [2, 4, 9 ,10]
n = map(lambda x: x**2, num)
print(list(n))
# reduce 合併函數(累積函數),在python2裏面,是做爲內置函數存在的,在python3裏面,則放在了 functools 裏面。應用場景:hadloop 大數據
from functools import reduce
numlist = [1,3,5,7,9]
# 求全部元素相加只和
sum = reduce(lambda x,y: x+y, numlist, 10) # 第一個參數是個函數:lambad,第二個參數是一個迭代器。
# 第三個參數是初始值,若是默認沒有的話,則爲:1+3+5+7+9。若是有初始值的話,則爲:10+1+3+5+7+9
print(sum)
# filter() 函數用於過濾序列,過濾掉不符合條件的元素,返回由符合條件元素組成的新列表。
# 該接收兩個參數,第一個爲函數,第二個爲序列,序列的每一個元素做爲參數傳遞給函數進行判,而後返回 True 或 False,
# 最後將返回 True 的元素放到新列表中
# 應用1: 過濾出 以SB爲結尾的 列表元素
l = ['w_SB', 'b_SB', 'c', 'd_SB']
g = filter(lambda x: x.endswith('SB'), l)
print(list(g))
# 應用2:過濾出列表中全部的奇數
l1 = [1,2,3,4,5,6,7,8]
def is_odd(n):
return n % 2 == 1
new_list = filter(is_odd, l1)
print(list(new_list))
# 應用3:過濾出1~100中平方根是整數的數:
import math
def is_sqr(x):
return math.sqrt(x) %1 == 0
sqr = filter(is_sqr, range(1,101))
print(list(sqr))
def eater(name):
print(' %s ready to eat' % name)
while True:
food = yield
print('%s start to eat %s' % (name, food))
g = eater('zhang')
next(g) # next() 就至關於 g.send(None),執行 g.send() 以前必須next(g)一次,或者執行 g.send(None)一次。
g.send('wo')
# 能夠嘗試用一個裝飾器,在執行eater() 以前,就初始化,執行了,g.send(None),以下所示:
def init(func):
def wrapper(*args, **kwargs):
g = func(*args,**kwargs)
next(g)
return g
return wrapper
@init
def eater(name):
print('%s ready to eat' % name)
while True:
food = yield
print('%s start to eat %s' % (name, food))
g = eater('zhang') # 輸出:zhang ready to eat
g.send('shit') # 輸出:zhang start to eat shit
print(g.send('shit2')) # 會輸出 None ,緣由是 yield 後面沒有值,若是想要輸出值, yield後面須要有值。
# 若是每次打印上了什麼菜。就須要在yield後面加上數據
def init(func):
def wrapper(*args, **kwargs):
g = func(*args,**kwargs)
next(g)
return g
return wrapper
@init
def eater(name):
print('%s ready to eat' % name)
foodlist = []
while True:
food = yield foodlist
foodlist.append(food)
print('%s start to eat %s' % (name, food))
g = eater('zhang') # 輸出:zhang ready to eat
#g.send 表示先把shit 賦值給yield,而後由yield再賦值給 food
g.send('shit') # 輸出:zhang start to eat shit
print(g.send('shit2')) # 會輸出 None ,緣由是 yield 後面沒有值,若是想要輸出值, yield後面須要有值。
print(g.send('shit3'))
# 經過yeild來實現 【grep -rl 'python' /root 】這個linux命令,意思是:經過遞歸的方式 找到root目錄下全部包含 python 內容的文件名
# os.walk 方法是用來遍歷路徑的。 r 參數表示用路徑用"原生字符串"進行遍歷 。意思是"\" python 解釋器就不要處理了,r=raw-string。
# 在windows環境須要用 r。在linux下則不須要了
import os
# address = os.walk(r'/Users/zhangzhihui/Desktop/Python/Basic/A')
#
# def search(search_path):
# address = os.walk(search_path)
# for par_dir, _, files in address: # 這裏有三個值,【par_dir, _, files】par_dir 表示父目錄,
# # _表示子目錄(不須要子目錄的話,用_表示就能夠了),files表示子文件
# for file in files:
# file_abs_path = par_dir + '/' + file
# print(file_abs_path)
#
# search('/Users/zhangzhihui/Desktop/Python/Basic/A')
# 上面的方法只能search一次,若是須要屢次執行 search的話,就須要用 yield 方法了,由於yield生成器函數每次都須要執行一次 next(),
# 不然就會報錯,因此須要加一個裝飾器,讓裝飾器來每次執行一下 next()方法。 以下代碼所示:
def init(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
next(res)
return res
return wrapper
# @init
# def search():
# while True:
# search_path = yield
# address = os.walk(search_path)
# for par_dir, _, files in address:
# print(par_dir)
# for file in files:
# file_abs_path = par_dir + '/' + file
# print(file_abs_path)
# g = search() #search()就是一個生成器
# g.send('/Users/zhangzhihui/Desktop/Python/Basic') # 此時會將 該目錄下的全部文件都遍歷出來
# 寫一個open函數,源源不斷的讀取傳過來的路徑,而後打開路徑下的文件。
# @init
# def opener():
# while True:
# file_abs_path = yield # 生成器 send一次,會傳一次值給 yield 而後賦值給 file_abs_path
# print(file_abs_path)
# # with open(file_abs_path,encoding='utf-8') as f:
# # pass
#
# o = opener()
# o.send('/Users/zhangzhihui/Desktop/Python/Basic/A')
# o.send('/Users/zhangzhihui/Desktop/Python')
import time
#定義一個函數,延遲3秒 打印出:I love you。若是在不修改 index的狀況下,調用index時,能夠打印出運行時間,此時就須要運用到裝飾器。
# def index(a):
# time.sleep(3)
# print ('I love you')
# index()
# 定一個裝飾器(裝飾器就是一個函數,格式至關於閉包函數的格式)
def timer(func):
def wrapper():
start_time = time.time()
func()
end_time = time.time()
run_time = end_time-start_time
print (run_time)
return wrapper
@timer # @timer 就是裝飾器的調用方法,至關於 index = timer(index)
def index():
time.sleep(3)
print ('I love you')
#此時直接調用 index 函數時,就能夠在不修改index的狀況下,爲其添加新功能。
index()
def f1():
x = 2
def f2():
print (x)
return f2
f = f1()
f()
# 在函數內部使用,包含對外部做用域而非全局做用域的引用
# get() 函數包含了對外部做用域的引用:url
from urllib import urlopen
def index(url):
def get():
res = urlopen(url).read()
return res
return get
baidu = index('http://www.baidu.com')
print (baidu())
# 查看閉包函數引用的值,只要是閉包函數就有一個:__closure__ .它的結果是一個 cell。
url = baidu.__closure__[0].cell_contents
print (url)
=================第三天相關筆記=====================linux
=================次日相關筆記=====================git
=================第一天相關筆記=====================shell
1 user = { 2 'name': 'zhiHui', 3 'age': 18, 4 'gender': 'male' 5 }
# 打印字典裏的key for item in val.keys(): print(item) # 打印字典裏的values for item in val.values(): print(item) # 打印鍵值對 for key, value in val.items(): print(key, value)
1 user_dict = { 2 'k1': 'value1', 3 'k2': {'kk1': 'vv1', 'kk2': 'vv2', 'kk3': 'vv3'}, 4 'k3': 123, 5 'k4': ['alex', 'eric', ['a', 'b', 'c'], '張志輝', {'k11': 'v11'}] 6 } 7 8 # K4下的list列表中append一個元素 9 user_dict['k4'][2].append('dog') 10 print(user_dict) 11 12 # 經過索引獲得其中的一個元素的value 13 n = user_dict['k4'][4]['k11'] 14 print(n) 15 16 # 經過key更新 value 17 user_dict['k2']['kk1'] = 'zhang' 18 print(user_dict) 19 20 # 插入key and value 21 user_dict['k5'] = 7899 22 print(user_dict)