开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项
官网:https://www.anaconda.com
可视化网页开发工具
安装:
anacond自带或使用pip install jupyter notebook
安装
启动:
命令行jupyter notebook
{"name":"xiao","age":10}
if data is not None:
list = [1,2,3]
a = 1
a in list 返回True
a not in list 返回False
#等价Java的& | !
a==b and a==c
a==b or a==c
not a==b
python 中没有else if,只有elif
if a < 10:
b = 'small'
elif a < 20:
b = 'young'
else:
b = 'big'
print(b)
#简写
a = 3
b = 'big' if a > 2 else 'small'
print(b)
range(100)会遍历0-99的数字
for i in range(100):
print(i)
range(2,5),会输出[2,3,4]
range(3,10,2),输出 [3,5,7,9],最后一个参数是步长
列表(list/set)中任意一个元素是True,返回True
pwd = 'asdd12a'
have_num = any(i.isdigit() for i in pwd)
print(have_num)
round(数字,2)会给保留小数点后两位数字
idx = 0
while idx < 100:
print(idx)
idx += 1
字符串前加r表示row-string,字符串中的反斜线\将会是正常字符而不是转义符
1. []中的字符是可选择性的,+代表一个或多个,.代表任意字符,用\.代表.,{2,4}代表限制2-4个
2. ()代表分组,在re.sub的第二个参数,用\1和\2可以引用前面的两个分组
import re
datestr = "2022-06-28"
result = re.match(r'\d{4}-\d{2}-\d{2}',datestr)
print(result is not None)
#提取11位电话号
import re
strs = '友情的骄傲开发17612231234大幅18814567892'
resus = re.findall(r'1\d{10}',strs)
for res in resus:
print(res)
import re
emails = ["嗯[email protected]","唐asdf12dsa#abc.com代","接口的[email protected]交付","发哦python-abc@163com及","看得见法[email protected]看到"]
patterns = re.compile(r"[a-zA-Z0-9_-]+@[a-zA-Z0-9]+\.[a-zA-Z]{2,4}")
results = patterns.findall("".join(emails))
print(results)
import re
content = r"这个商品很好,质量最好,用起来不错,并且价格最低,绝对物美价廉"
#使用|分隔可以同时匹配多个字符串
pattern = r"最好|最低|绝对"
print(re.sub(pattern,"***",content))
替换手机号中间4位
import re
strs = '友情的骄傲开发17612231234大幅18814567892'
pattern = r'(1\d{2})\d{4}(\d{4})'
resu = re.sub(pattern,r"\1****\2",strs)
print(resu)
#输出 友情的骄傲开发176****1234大幅188****7892
单引号和双引号几乎等价。单引号中放双引号或者双引号中放单引号不用转义
三个双引号或者三个单引号,可以包含多行数据,并且里面可以随便包含双引号和单引号。
sql = """
select *
from table
where name like '%li%'
order by id desc
"""
print(sql)
s = "buy %s,count=%d,price=%f"%("apple",10,1.5)
print(s)
%s 字符串
%d 整型数字
%f 浮点型数字
结果:
buy apple,count=10,price=1.500000
s = "{vara} and {varb}".format(vara="liming",varb="xiaomei")
print(s)
结果:
liming and xiaomei
l = ['1','2','3']
s = "aa".join(l)
print(s)
#l集合总必须是字符类型,否则无效
结果:
1aa2aa3
name = "zhangli"
age = 18
s = f"名字{name},age is {age}"
#name、age是前面已经定义好的参数
结果:
名字zhangli,age is 18
import re re.split(r",| ",s)
用逗号和空格分隔,加的r
写正则时更好用s='nihao,shijie'
t='nihao'
result = t in s
print result
#打印True
import string
s='nihao,shijie'
t='nihao'
result = string.find(s,t)!=-1
print result
#打印True
str = ‘0123456789’
print str[0:3] #截取第一位到第三位的字符
print str[:] #截取字符串的全部字符
print str[6:] #截取第七个字符到结尾
print str[:-3] #截取从头开始到倒数第三个字符之前
print str[2] #截取第三个字符
print str[-1] #截取倒数第一个字符
print str[::-1] #创造一个与原字符串顺序相反的字符串
print str[-3:-1] #截取倒数第三位与倒数第一位之前的字符
print str[-3:] #截取倒数第三位到结尾
print str[:-5:-3] #逆序截取,具体啥意思没搞明白?
--------------------------------------
输出结果:
012
0123456789
6789
0123456
2
9
9876543210
78
789
96
s[::-1]
data = ['a','b','c','d']
data[0] == 'a'
data[-1] == 'd'
data[2:3] == 'c'
#list可以修改
data[2:4] = [1,2,3]
data变成['a','b',1,2,3]
max(list)
squares = [x*x for x in list if x%2==0]
表示遍历list集合,其中元素取模2为零(偶数),则把元素放到squares集合中
例子:
data = [1,2,3,4,5]
print("\t.join([str(i) for i in data])")
#集合中是字符才能使用join方法,列表推导式的if条件可以不加
data = [1,2,3,4,5]
list = [i for i in data if i%2==0]
print(list)
# 结果 2,4
上面排序方法key可以传一个函数
对学生按成绩排序(学号,成绩)
sgrades = [(1001, 89), (1002, 77), (1003, 99)]
sgrades.sort(key=lambda x: x[1],reverse=True)
print(sgrades)
l1 = [1,2,3]
l2 = [4,5,6]
for i,j in zip(l1,l2):
print(i+j)
# 结果打印
5
7
9
元组相比列表list,不能改变元素值。比较安全,不担心被修改。
元组存异质元素,list存同质元素。即用元组存不同类型的数据,list存相同类型元素。
tup = (1001,1002)
tup = 1001,1002 #括号省略
tup = ()
tup = (1001,) #单元素元组必须加上逗号
大多数和列表list相同。
key value结构
dict = {key1:val1,key2:value2}
#key必须是不可变的,如数字、字符串、元组,不能是可变的列表
dict = {"id":1,"name":"zhang"}
print(dict["id"])
print(dict["name"])
# 如果key不存在会报错。
dict = {"id": 1, "name": "zhang"}
for a,b in dict.items():
print(a,b)
s = set()
s = {1,2,3}
s = set([1,2,3]) #参数可以是列表、元组、字符串(把里面字符变成集合元素)
self作用是在方法(函数)中引用类对象
if isinstance(jsons, dict):
isinstance函数是Python的内部函数,他的作用是判断jsons这个参数是否为dict类型
data = [1,2]
type(data)
#结果
将返回值用类型名
list = getname()
强转 string->int
nu = "1"
int(nu)
fin = open("./input.txt")
for line in fin:
#strip()可以去掉每行后的换行符,int()强转成int类型
number = int(line.strip())
print(number)
fin.close()
不用自己关闭流的方式
with open("./input.txt") as fin:
for line in fin:
number = int(line.strip())
print(number)
os.path.join可以拼接一个目录和一个文件名,得到一个结果路径
import os
dir = r"D:\tmp\zookeeper"
for root,dirs,files in os.walk(dir):
'''
os.walk会递归扫描所有目录
root表示当前目录
dirs表示root下的子目录名列表
files表示root下的文件名列表
os.path.join可以拼接一个目录和一个文件名,得到一个结果路径
'''
print("root:",root)
print("dirs:",dirs)
for file in files:
fpath = os.path.join(root,file)
print(fpath)
统计每个Python文件行数
dir = r"D:\work\workspace_python"
for root, dirs, files in os.walk(dir):
for file in files:
if file.endswith('.py'):
fpath = os.path.join(root,file)
with open(fpath,encoding="utf8") as fin:
print(fpath,len(fin.readlines()))
将目录下文件按扩展名分类移动到各扩展名下的文件夹中
import shutil
import os
dir = r"D:\tmp\tmp"
# os.listdir列出目录下所有子目录和文件
for file in os.listdir(dir):
splits = os.path.splitext(file)
# splits,以file=1.mp3为例,splits=['1','.mp3']
print(splits)
ext = splits[1]
#去掉.
ext = ext[1:]
if not os.path.isdir(f"{dir}/{file}"):
#创建文件夹
os.mkdir(f"{dir}/{ext}")
sourcePath = f"{dir}/{file}"
targetPath = f"{dir}/{ext}/{file}"
#移动文件
shutil.move(sourcePath,targetPath)
zipfile模块
以~$字符串开头的是临时文件,可忽略
import zipfile
dir = r"D:\tmp\tmp"
output_name = f"{dir}.zip"
#获取父目录
parent_name = os.path.dirname(dir)
zip = zipfile.ZipFile(output_name,"w",zipfile.ZIP_DEFLATED)
for root,dirs,files in os.walk(dir):
for file in files:
#过滤临时文件
if str(file).startswith("~$"):
continue
filepath = os.path.join(root,file)
#取文件相对路径,写进压缩包时写相对路径
writepath = os.path.relpath(filepath,parent_name)
zip.write(filepath,writepath)
zip.close()
import requests
url = "http://www.baidu.com"
r = requests.get(url)
"""
post方法请求
request.post(
'http://xxx.com/postMethod',
data={'key':'value'}
)
"""
if r.status_code == 200:
print(r.text)
else:
print("error",r.status_code)
def downloadImage():
url = r"http://image.suifengxing.cn/classloader.jpg"
r = requests.get(url)
#wb 写入byte文件
with open(r"D:\tmp\classloader.jpg","wb") as f:
#r.content二进制形式
f.write(r.content)
webbrowser.open(url)可以直接在浏览器打开一个url
import webbrowser
def baiduSearch(wd):
url = r"https://www.baidu.com/s?wd="
webbrowser.open(url+wd)
glob.glob("p054/*.txt")
可以匹配p054目录下符合规则得所有文件列表,*号通配符
全局变量要在函数中更改必须加上global关键字
def func(a,b,c=11):
lambda 参数:操作(参数)
# 定义
sum = lambda x,y: x+y
# 调用
sum(1,2)
dir和help
import math
print(dir(math))
print(help(math.cos))
# 类名驼峰形式,首字符大写
class Student:
"""类注释"""
# 类变量
total_cnt = 0
def __init__(self,name,age):
"""初始化方法"""
# 普通实例变量,每个实例独有
self.name = name
self.age = age
Student.total_cnt += 1
def set_grade(self,grade):
"""普通方法"""
self.grade = grade
s1 = Student("zhang",20)
s2 = Student("li",25)
#访问类属性
print(Student.total_cnt)
#访问实例属性
print(s1.name,s1.age)
#调用实例方法
s1.set_grade(100)
包package下的.py结尾的文件
__init__.py
用于区分普通目录和package包
import module1,module2
# 从包中引入模块
from pkg1.pkg2 import module3
# 从模块中引入函数/类
from pkg1.pkg2.module3 import func/class
模块引入时,先找当前目录,找不到去PYTHONPATH中路径列表中找。
把自己模块路径写入Pythonpath中
import sys
sys.path.append("目录")
__main__
。所以可以判断if __name__ == "__main__"
时,执行测试代码,这样别人引用module不会执行,自己又可以测试。pip3 install requests
或python3.9 -m pip install requests
import multiprocessing
def process(d):
return d*d
if __name__ =="__main__":
#参数是使用cpu核数,不指定默认使用cpu全部核数
with multiprocessing.Pool(3) as pool:
results = pool.map(process,[1,2,3,4])
print(results)
d = {"id":1,"name":"2"}
# indent能让json缩进美观
json.dumps(d,indent=2))
import time
# 每两秒打印一次hello,参数可以传小数,如0.5,定时器
while True:
print(:hello)
time.sleep(2)
import time
#打印当前时间戳
print(time.time())
#打印yyyy-MM-dd HH:mm:ss格式时间,具体Python格式参考 https://strftime.org/
print(time.strftime("%Y-%m-%d %H:%M:%S"))
from datetime import datetime
#打印yyyy-MM-dd HH:mm:ss格式时间,具体Python格式参考 https://strftime.org/
print(datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
#打印当前时间年份
print(datetime.now().year)
#将字符串转为datetime格式数据
birthday = datetime.strptime("2022-05-14","%Y-%m-%d")
print(type(birthday))
print(birthday)
#日期格式数据可以直接加减
curr_date = datetime.now()
minus_date = curr_date - birthday
print(minus_date.days)
import datetime
curr_date = datetime.datetime.now()
gap = datetime.timedelta(days=10)
pre = curr_date - gap
print(pre.strftime("%Y-%m-%d"))
begin_date = "2022-06-01"
end_date = "2022-06-02"
print(begin_date > end_date)
import string
#小写字符集合
print(string.ascii_lowercase)
#大写字符集合
print(string.ascii_uppercase)
#数字
print(string.digits)
#标点符号
print(string.punctuation)
import random
# 随机从序列中采样几个字符得到一个列表 random.dample
words = string.ascii_lowercase
# len得到len长度的随机字符列表
password = random.sample(words,len)
print("".join(password))
#f.readlines()可以得到文件中所有行
with open("./input.txt","r",encoding="utf-8") as f:
nums = [num.strip() for num in f.readlines()]
print(nums)
#with后可以接多个open
with open('1.txt') as fin,open('2.txt') as out:
pass什么都不干,跟没有代码一样的效果,显得专业
#input读取键盘输入的字符串,lower将字符变小写
word = input("enter your word:").lower()
print(word)
try:
代码块
except KeyError as e:
print("KeyError异常",e)
except [Exception as e]:
#Exception可捕获所有异常
print("异常代码",e)
#可以自己抛出异常
raise Exception("主动抛出的异常")
finally:
#一般用于资源清理,如文件关闭
print("do something")
使用sys.argv传参数
sys.argv类型是list,命令行参数列表,list中第一个是脚本名称或路径,后面是命令行传的参数
uuid4是全随机的方法
import uuid
uid = str(uuid.uuid4())
#去掉-
suid = ''.join(uid.split('-'))
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import redis
import json
r = redis.Redis(host='172.0.0.1', port=6379, db=9, password='123456')
result = r.scan(count=100,cursor=0,match=None)
outputlist=["["]
count = 0
for i in range(len(result[1])):
key = result[1][i]
value = r.get(key)
outputlist.append("{")
outputlist.append("\"")
outputlist.append(key)
outputlist.append("\"")
outputlist.append(":")
outputlist.append(value)
outputlist.append("}")
outputlist.append(",")
outputlist.pop()
outputlist.append("]")
file = open("/Users/xdf/tmp/redisdata.json",mode="w+")
# file.write("".join(outputlist))
json.dump("".join(outputlist),file)
file.close()
#读取文件,解析json
file = open("/Users/xdf/tmp/redisdata.json",mode="r+")
# var = file.read()
# if isinstance(var,unicode):
# var = var.encode("utf-8")
# file.close()
# list = json.loads(var)
# for dict in list:
# print dict.keys()[0]
# print dict.get(dict.keys()[0])
var = json.load(file)
file.close()
print type(var)
if isinstance(var,unicode):
var = var.encode("utf-8")
print type(var)
print var
var2 = json.loads(var,encoding="utf-8")
print type(var2)
list = var2
for dict in list:
# print type(dict.get(dict.keys()[0]))
# print dict.get(dict.keys()[0])
print json.dumps(dict.get(dict.keys()[0]))
print type(json.dumps(dict.get(dict.keys()[0])))
dict1 = dict.get(dict.keys()[0])
# print dict1.keys()
print dict1.get("status")
print type(dict1.get("metaData"))