三元运算:
name = 'Tom' if 1 == 1 else 'fly'
print(name)
# 运行结果: Tom
三元运算与lambda结合:
f = lambda x:x if x % 2 != 0 else x + 100
print(f(10)) # 110
lambda基本使用:
f = lambda x,y,z:x+y+z
print(f(1,2,3)) # 6
my_lambda = lambda arg : arg + 1
print(my_lambda(10)) # 11
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
利用 filter、lambda表达式 获取l1中元素小于33的所有元素 l1 = [11, 22, 33, 44, 55]:
l1= [11,22,33,44,55]
a = filter(lambda x: x<33, l1)
print(list(a))
自定义函数代替lambda实现相同功能:
l1= [11,22,33,44,55]
def func(num):
if num>33:
return num
result=filter(func,l1)
print(list(result))
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。**
map使用:第一个参数接收一个函数名,第二个参数接收一个可迭代对象
map最基本使用:
lt = [1, 2, 3, 4, 5, 6]
def add(num):
return num + 1
rs = map(add, lt)
print(list(rs)) #运行结果: [2, 3, 4, 5, 6, 7]
利用map,lambda表达式将所有偶数元素加100:
l1= [11,22,33,44,55]
ret = map(lambda x:x if x % 2 != 0 else x + 100,l1)
print(list(ret))
# 运行结果: [11, 122, 33, 144, 55]
利用map,lambda表达式将所有偶数元素加100:
l1= [11,22,33,44,55]
def add(num):
if num%2 == 0:
return num
else:
return num + 100
rs = map(add, l1)
print(list(rs))
自定义函数代替lambda实现相同功能:
l1= [11,22,33,44,55]
def add(num):
if num%2 == 0:
return num
else:
return num + 100
rs = map(add, l1)
print(list(rs))
reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。
使用reduce进行求和运算:
在这里插入代码片复制代码
from functools import reduce
def f(x, y):
return x + y
print(reduce(f, [1, 3, 5, 7, 9])) # 25
# 1、先计算头两个元素:f(1, 3),结果为4;
# 2、再把结果和第3个元素计算:f(4, 5),结果为9;
# 3、再把结果和第4个元素计算:f(9, 7),结果为16;
# 4、再把结果和第5个元素计算:f(16, 9),结果为25;
# 5、由于没有更多的元素了,计算结束,返回结果25。
print( reduce(lambda x, y: x + y, [1, 3, 5, 7, 9]) ) # 25
使用reduce将字符串反转:
'''使用reduce将字符串反转'''
s = 'Hello World'
from functools import reduce
result = reduce(lambda x,y:y+x,s)
# 1、第一次:x=H,y=e => y+x = eH
# 2、第二次:x=l,y=eH => y+x = leH
# 3、第三次:x=l,y=leH => y+x = lleH
print( result ) # dlroW olleH
功能:对所有可迭代的对象进行排序操作
1)sorted和sort区别
2)sorted使用
sorted 语法:sorted(iterable, cmp=None, key=None, reverse=False)
iterable -- 可迭代对象。
cmp -- 比较的函数
key -- 主要是用来进行比较的元素,只有一个参数,具体的函数的参数就是取自于可迭代对象中,指定可迭代对象中的一个元素来进行排序。
reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)。
sorted对列表排序:
students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
print( sorted(students, key=lambda s: s[2], reverse=False) ) # 按年龄排序
# 结果:[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
sorted对字典排序:
d = {'k1':1, 'k3': 3, 'k2':2}
# d.items() = [('k1', 1), ('k3', 3), ('k2', 2)]
a = sorted(d.items(), key=lambda x: x[1])
print(a) # [('k1', 1), ('k2', 2), ('k3', 3)]
1. open(name[, mode[, buffering]]) 打开文件可传的参数
2. 打开文件的模式有
• r,只读模式(默认)。
• w,只写模式。【不可读;不存在则创建;存在则删除内容;】
• a,追加模式。【可读; 不存在则创建;存在则只追加内容;】
注: "+" 表示可以同时读写某个文件
• w,只写模式。【不可读;不存在则创建;存在则删除内容;】
• w+,写读
• a+,同a
3、with语句
作用:将打开文件写在with中当对文件操作完成后with语句会自动帮关闭文件,避免忘记写f.close()
with读文件:
with open("data1.txt",'r',encoding = 'utf-8') as f:
for line in f:
print(line)
三种读操作举例:
#1. read()一次读取所有内容
'''aaa111
bbb222'''
f = open(r"data.txt")
print(f.read())
f.close()
#2. readline(),每次只读取一行,光标下移
'''
0: aaa111
1: bbb222
'''
f = open(r"data.txt")
for i in range(2):
print(str(i) + ": " + f.readline(),)
#3. 一次读取所有,每行作为列表的一个值
'''['aaa111\n', 'bbb222\n']'''
f = open(r"data.txt")
print(f.readlines())
1. read(n)读取指定长度的文件
read读取指定长度字符串:
f = open(r"somefile.txt")
print(f.read(7)) # Welcome 先读出 7 个字符
print(f.read(4)) #‘ to ‘ 接着上次读出 4 个字符
f.close()
2. seek(offset[, whence]) 随机访问
作用:从文件指定位置读取或写入
从指定位置写入:
f = open(r"somefile.txt", "w")
f.write("01234567890123456789")
f.seek(5)
f.write("Hello, World!")
f.close()
f = open(r"somefile.txt")
print(f.read()) # 01234Hello, World!89
3. tell 返回当前读取到文件的位置下标
返回读取位置下标:
f = open(r"somefile.txt")
f.read(1)
f.read(2)
print(f.tell()) # 3 3就是读取到文件的第三个字符
4、readline()读文件
作用:readline 的用法,速度是fileinput的3倍左右,每秒3-4万行,好处是 一行行读 ,不占内存,适合处理比较大的文件,比如超过内存大小的文件
readline读取大文件:
f1 = open('test02.py','r')
f2 = open('test.txt','w')
while True:
line = f1.readline()
if not line:
break
f2.write(line)
f1.close()
f2.close()
5、readlines()读文件
作用:readlines会把文件都读入内存,速度大大增加,但是木有这么大内存,那就只能乖乖的用readline
readlines读文件:
f1=open("readline.txt","r")
for line in f1.readlines():
print(line)
6、将data1.txt中内容读取并写入到data2.txt中
将data1.txt内容读取到data2.txt:
f1 = open('data1.txt','r')
f2 = open('data2.txt','w')
for line in f1:
f2.write(line)
f1.close()
f2.close()
7、使用eval()方法将文件读取成字典
将文件读取成字典:
f = open('data1.txt')
f1 = (f.read())
data = eval(f1)
f.close()
print(data) # 运行结果: {'k2': 'v2', 'k3': 'v3', 'k1': 'v1'}
8、将文件内容读取成列表
View Code:
lock = []
f = open("password.txt")
for name in f.readlines():
lock.append(name.strip('\n'))
print(lock)
运行结果: ['aaa 111', 'bbb 222', 'ccc 333']
subprocess模块是python从2.4版本开始引入的模块。主要用来取代 一些旧的模块方法,如os.system、os.spawn*、os.popen*、commands.*等。subprocess通过子进程来执行外部指令,并通过input/output/error管道,获取子进程的执行的返回信息。
subprocess常用函数:
#1、返回执行状态:0 执行成功
retcode = subprocess.call(['ping', 'www.baidu.com', '-c5'])
#2、返回执行状态:0 执行成功,否则抛异常
subprocess.check_call(["ls", "-l"])
#3、执行结果为元组:第1个元素是执行状态,第2个是命令结果
>>> ret = subprocess.getstatusoutput('pwd')
>>> ret
(0, '/test01')
#4、返回结果为 字符串 类型
>>> ret = subprocess.getoutput('ls -a')
>>> ret
'.\n..\ntest.py'
#5、返回结果为'bytes'类型
>>> res=subprocess.check_output(['ls','-l'])
>>> res.decode('utf8')
'总用量 4\n-rwxrwxrwx. 1 root root 334 11月 21 09:02 test.py\n'
将dos格式文件转换成unix格式:
subprocess.check_output(['chmod', '+x', filepath])
subprocess.check_output(['dos2unix', filepath])
child.wait()等待子进程执行:
#1、先打印'parent process'不等待child的完成
import subprocess
child = subprocess.Popen(['ping','-c','4','www.baidu.com'])
print('parent process')
#2、后打印'parent process'等待child的完成
import subprocess
child = subprocess.Popen('ping -c4 www.baidu.com',shell=True)
child.wait()
print('parent process')
child.poll() # 检查子进程状态
child.kill() # 终止子进程
child.send_signal() # 向子进程发送信号
child.terminate() # 终止子进程
分步执行cat /etc/passwd | grep root命:
import subprocess
#下面执行命令等价于: cat /etc/passwd | grep root
child1 = subprocess.Popen(["cat","/etc/passwd"], stdout=subprocess.PIPE)
child2 = subprocess.Popen(["grep","root"],stdin=child1.stdout, stdout=subprocess.PIPE)
out = child2.communicate() #返回执行结果是元组
print(out)
#执行结果: (b'root:x:0:0:root:/root:/bin/bash\noperator:x:11:0:operator:/root:/sbin/nologin\n', None)
获取ping命令执行结果:
import subprocess
list_tmp = []
def main():
p = subprocess.Popen(['ping', 'www.baidu.com', '-c5'], stdin = subprocess.PIPE, stdout = subprocess.PIPE)
while subprocess.Popen.poll(p) == None:
r = p.stdout.readline().strip().decode('utf-8')
if r:
# print(r)
v = p.stdout.read().strip().decode('utf-8')
list_tmp.append(v)
main()
print(list_tmp[0])
在windows中安装paramiko: pip3 install paramiko
paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接。跟常用软件xshell 、xftp功能一样,但是可以连接多台服务器,进行复杂的操作。
ssh root@10.1.0.51 #ssh远程登录
scp -rp aa.txt root@10.1.0.50:/tmp/ #将本地aa.txt文件复制到10.1.0.50的/tmp文件夹中
远程执行命令:
import paramiko
# 1 创建SSH对象
ssh = paramiko.SSHClient()
# 2 允许连接不在know_hosts文件中的主机
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
# 3 连接服务器
ssh.connect(hostname='1.1.1.3', port=22, username='root', password='chnsys@2016')
# 4 执行命令 #stdin标准输入: 自己输入的命令
stdin, stdout, stderr = ssh.exec_command('pwd') # stdout标准输出: 命令执行结果
# 5 获取命令结果 #stderr标准错误: 命令执行报错的结果
res, err = stdout.read(), stderr.read()
result = res if res else err
print(result.decode()) #运行结果: /root
# 6 关闭连接
ssh.close()
SFTPClient实现对Linux服务器上传和下载:
import paramiko
#1 连接客户端
transport = paramiko.Transport(('10.1.0.50',22))
transport.connect(username='root',password='chnsys@2016')
#2 定义与客户端交互 将刚刚定义的transport当参数传递给他
sftp = paramiko.SFTPClient.from_transport(transport)
#3 将location.py 上传至服务器 /tmp/test.py
sftp.put(r'C:\bbb\file.txt', '/tmp/file.txt')
#4 将remove_path 下载到本地 local_path
sftp.get('/tmp/file.txt',r'C:\bbb\file.txt')
#5 关闭连接
transport.close()
# 正则表达式,就是做字符串匹配的,在re模块出现之前就有这个正则表达式了,任何语言都有这个,
# 要使用Python来操作正则表达式,就要使用到re模块了,
# # 正则表达式只和字符串匹配有关系,和其他的数据类型没有关系,
# 应用非常的广泛,
# 比如手机号,
# 比如身份证号
# 比如邮箱,
①‘[pj]ython’ 只能够匹配‘python’ ‘jython’
② ‘[a-z]’ 能够(按字母顺序)匹配a-z任意一个字符
③‘[a-zA-Z0-9]’ 能匹配任意一个大小写字母和数字
④‘[^abc]’ 可以匹配任意除a,b和c 之外的字符串
作用:一次性匹配多个字符串
例如:’python|perl’ 可以匹配字符串‘python’ 和 ‘perl’
‘aabbccddee’
‘aaccddee’
‘bbccddee’
‘ccddee’
① ‘w+’ 匹配以w开通的字符串
② ‘^http’ 匹配以’http’ 开头的字符串
③‘ $com’ 匹配以‘com’结尾的字符串
\d 匹配任何十进制数;它相当于类 [0-9]。
\D 匹配任何非数字字符;它相当于类 [^0-9]。
\s 匹配任何空白字符;它相当于类 [ fv]。
\S 匹配任何非空白字符;它相当于类 [^ fv]。
\w 匹配任何字母数字字符;它相当于类 [a-zA-Z0-9_]。
\W 匹配任何非字母数字字符;它相当于类 [^a-zA-Z0-9_]。
\w* 匹配所有字母字符
\w+ 至少匹配一个字符
re模块更详细表达式符号:
1 '.' 默认匹配除\n之外的任意一个字符,若指定flag DOTALL,则匹配任意字符,包括换行
2 '^' 匹配字符开头,若指定flags MULTILINE,这种也可以匹配上(r"^a","\nabc\neee",flags=re.MULTILINE)
3 '$' 匹配字符结尾,或e.search("foo$","bfoo\nsdfsf",flags=re.MULTILINE).group()也可以
4 '*' 匹配*号前的字符0次或多次,re.findall("ab*","cabb3abcbbac") 结果为['abb', 'ab', 'a']
5 '+' 匹配前一个字符1次或多次,re.findall("ab+","ab+cd+abb+bba") 结果['ab', 'abb']
6 '?' 匹配前一个字符1次或0次
7 '{m}' 匹配前一个字符m次
8 '{n,m}' 匹配前一个字符n到m次,re.findall("ab{1,3}","abb abc abbcbbb") 结果'abb', 'ab', 'abb']
9 '|' 匹配|左或|右的字符,re.search("abc|ABC","ABCBabcCD").group() 结果'ABC'
10 '(...)' 分组匹配,re.search("(abc){2}a(123|456)c", "abcabca456c").group() 结果 abcabca456c
11
12 '\A' 只从字符开头匹配,re.search("\Aabc","alexabc") 是匹配不到的
13 '\Z' 匹配字符结尾,同$
14 '\d' 匹配数字0-9
15 '\D' 匹配非数字
16 '\w' 匹配[A-Za-z0-9]
17 '\W' 匹配非[A-Za-z0-9]
18 's' 匹配空白字符、\t、\n、\r , re.search("\s+","ab\tc1\n3").group() 结果 '\t'
19 \b 匹配一个单词边界,也就是指单词和空格间的位置,如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”
20 \B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”