=================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)