list(range(1, 11))
zip()函数
a = ["a1", "a2", "a3", "a4", "a5"]
b = ["b1", "b2", "b3", "b4", "b5"]
for i, j in zip(a, b):
print(i,j)
[x * x for x in range(1, 11)]
[x * x for x in range(1, 11) if x % 2 == 0]
[m + n for m in 'ABC' for n in 'XYZ']`filter()`
items()可以迭代多个对象
d = {'x': 'A', 'y': 'B', 'z': 'C' }
for k, v in d.items():
print(k, '=', v)
generator可以将列表生成式改成生成器(),必须通过next()方法才能执行调用
from collections import Iterable # 判断是否可迭代先导包
isinstance([], Iterable)
这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。
Python的for循环本质上就是通过不断调用next()函数实现的。
filter() 传一个函数传一个数组
sorted() 对一个数组排序
map()参数一个函数(表达式,算法),数组
高级写法
def build(x, y):
return lambda: x * x + y * y
函数对象有一个__name__属性,可以拿到函数的名字:
call()方法,就可以直接对实例进行调用。
先定义metaclass,就可以创建类,最后创建实例
StringIO和BytesIO是在内存中操作str和bytes的方法,使得和读写文件具有一致的接口
Python的dict对象可以直接序列化为JSON的{}
json.dumps(s, default=student2dict)
分布式进程 https://www.liaoxuefeng.com/wiki/1016959663602400/1017631559645600
Base64是一种用64个字符来表示任意二进制数据的方法,Base64是一种最常见的二进制编码方法
Python的hashlib提供了常见的摘要算法,如MD5,SHA1等等。
摘要算法不是加密算法
协程看上去也是子程序,但执行过程中,在子程序内部可中断,然后转而执行别的子程序,在适当的时候再返回来接着执行。
因为子程序切换不是线程切换,而是由程序自身控制,因此,没有线程切换的开销,和多线程比,线程数量越多,协程的性能优势就越明显。
第二大优势就是不需要多线程的锁机制,因为只有一个线程,也不存在同时写变量冲突,在协程中控制共享资源不加锁,只需要判断状态就好了,所以执行效率比多线程高很多。
因为协程是一个线程执行,那怎么利用多核CPU呢?最简单的方法是多进程+协程,既充分利用多核,又充分发挥协程的高效率,可获得极高的性能。
https://segmentfault.com/a/1190000017831088?utm_source=tag-newest session cookie token
sort()和sorted
sorted是内置函数对所有可迭代的对象都能排序
https://www.yuanrenxue.com/sanic/sanic-start.html sanic框架教程
import random
print(random.random()) # 生成0-1的随机浮点数
print(random.randint(1,20)) # 生成1-20的随机整数
print(random.uniform(1,10)) # 生成1-10的随机浮点数
a= ["黄焖鸡", "烤冷面", "麻辣拌", "炒菜"]
print(random.choice(a)) # 随机抽取
print(random.choices(a,[1,1,2,5])) # 权重的写法
print(random.sample(a, 2))
a = {1, 2, 3}
b = {3, 4, 5}
print(a | b) # 并集
print(a & b) # 交集
print(a - b) # 差集
print(b - a)
print(a ^ b) # 对称差集(两个集合中不重合的部分)
# 如果给的是列表直接强转成集合就可以
import time
a = ""
start = time.process_time()
for i in range(10000000):
a += "a"
end = time.process_time()
print(end - start)
运行时间27s
import time
a = []
for i in range(10000000):
a.append("a")
start = time.process_time()
"".join(a)
end = time.process_time()
print(end - start)
耗时0.3秒
分析,用join效率高太多了,因为字符串的是不可变对象,用+每次都会创建新的对象。
join一次性申请内存空间,然后直接复制过去,没有新的对象生成,所以效率高很多
print(False is False is False)
# eval()将str转化成内部的数据结构,应用于网络的数据包解开
a = "[[1,3],[4,6],9,89,242,22]"
print(eval(a))
https://www.cnblogs.com/ExMan/p/10374617.html
join和+在字符串拼接的效率问题
https://www.jianshu.com/p/d53449f9e7e0 好文
>>>a = 2
>>> isinstance (a,int)
True
>>> isinstance (a,str)
False
python中isinstance()的用法
# class XMeta(type): # 继承了type元类
# def __new__(cls, *args, **kwargs):
# print("new")
# print(cls)
#
# print(XMeta)
# print(type(XMeta))
#
# XMeta()
#
# import sys
# sys.setrecursionlimit(100000) #例如这里设置为十万
class Demo(object):
def __init__(self):
print("初始化")
@property
def name(self):
return self.__name
@name.setter
def name(self, value):
if value:
self.__name = value
def run(self):
print("run方法")
a = Demo()
a.name = "cui"
print(a.name)
# !/usr/bin/env Python3
# -*- encoding:UTF-8 -*-
# class Student(object):
#
# @property
# def score(self):
# return self.__score
#
# @score.setter
# def score(self, value):
# # if value >= 0 and value <= 100:
# # self.__score = value # 还记得__score吗?前面加一个双下划线,表示private私有属性
# # else:
# # raise ValueError('score must between 0 ~ 100!')
# if value:
# self.__score = value
# def age(self):
# self.__age = 26
# return self.__age
#
#
# s = Student()
# s.score = 90
# print(s.score)
# print(s.age())
代码练习,这里必须要是私有属性,要不会递归超出内置范围,改大了内存溢出
https://blog.csdn.net/Appleyk/article/details/77850120
https://blog.csdn.net/cliviabao/article/details/79927186
https://blog.csdn.net/junbujianwpl/article/details/79324814 今天python各种踩坑
要保证入口的唯一性 在新建文件执行插入数据库会报错
DROP TABLE table_name ; 删除表 一般不这么删除,直接可视化工具删除就可以,有的有外键约束,需要先删除关联才能将其他的删除
import pymysql
import pymssql
import time
from bloompy import ScalableBloomFilter
def timenow():
timestr = time.localtime(int(time.time()))
now = time.strftime("%Y-%m-%d %H:%M:%S", timestr)
return now
#configure sql server connect
def mssql_conn():
conn = pymssql.connect(
server="***",
user="***",
password="***",
database="***")
return conn
#configure mysql connect
def mysql_conn():
conn = pymysql.connect(
host="***",
port=3306,
user="***",
password="***",
database="***")
return conn
def bloomf():
bloom = ScalableBloomFilter(initial_capacity=100, error_rate=0.001, mode=ScalableBloomFilter.LARGE_SET_GROWTH)
conn = mysql_conn()
cur = conn.cursor()
print('*** Target table data add to BloomFilter ***\n...')
try:
cur.execute(t_sql)
result = cur.fetchone()
while result != None:
bloom.add(result)
result = cur.fetchone()
except:
print ("Error: unable to fetch data.")
finally:
print('Finished add.\n')
cur.close()
conn.close()
print(timenow(),'\n*** Compare source to target data ***\n...')
conn = mssql_conn()
cur = conn.cursor()
try:
cur.execute(s_sql)
num = 0
result = cur.fetchone()
while result != None:
if result in bloom:
pass
else:
print('{} is not in the bloom filter,not in Target table {}.'.format(result,tab))
num += 1
result = cur.fetchone()
if num == 0:
print('Result: {} ==> Target table data matches source table data.'.format(tab))
else:
print('\nResult: Need to compare output to repair data.')
except:
print ("Error: unable to fetch data.")
finally:
cur.close()
conn.close()
if __name__ == '__main__':
tab ='***'
t_sql='select concat(***, ***, ***, UpdateDate) from ***;'
s_sql="select convert(varchar(20),***)+convert(varchar(20),***)+convert(varchar(20),***,20)+convert(varchar(25),UpdateDate,21)+'000' from ***"
print('#Start:',timenow(),'\n')
bloomf()
print('\n#End:',timenow())
https://github.com/Qihoo360/Atlas 奇虎360团队开源mysql中间件
https://github.com/Meituan-Dianping/DBProxy/blob/master/doc/USER_GUIDE.md#1 美团点评在360基之上开发读写分离中间件
https://www.cnblogs.com/zhoujinyi/p/6697141.html 环境搭建
https://www.cnblogs.com/ExMan/p/11351628.html 使用心得
https://www.cnblogs.com/ExMan/p/11351632.html 实践
https://www.cnblogs.com/ExMan/p/11351623.html 加上keepalived实现高可用
codis:分布式的redis解决方案 https://www.cnblogs.com/ExMan/p/11351621.html
使用codis-admin搭建集群https://www.cnblogs.com/ExMan/p/11351609.html
https://www.cnblogs.com/ExMan/p/11324003.html
https://www.cnblogs.com/ExMan/p/11323984.html
https://www.cnblogs.com/ExMan/p/11323389.html
Linux iostat命令详解
Linux系统出现了性能问题,一般我们可以通过top、iostat、free、vmstat等命令来查看初步定位问题。
https://www.cnblogs.com/ExMan/p/11311530.html
合理设置redis主从buffer
https://www.cnblogs.com/ExMan/p/11295160.html
Flink消费Kafka数据并把实时计算的结果导入到Redis
https://www.cnblogs.com/ExMan/p/11285146.html
Filebeat+Kafka+Logstash+ElasticSearch+Kibana搭建完整版
https://www.cnblogs.com/ExMan/default.html?page=11
Flink+kafka实现Wordcount实时计算
https://www.cnblogs.com/ExMan/p/11285143.html
API设计风格(RRC、REST、GraphQL、服务端驱动)
https://www.cnblogs.com/ExMan/p/11284863.html
API 设计风格是一个很重要的话题,开发后会有一份API文档供测试和联调
最常见的方式就是本地调用远程,面向的是过程
级别0就是类RPC 级别3才是真正的Rest
HATEOAS是Hypertext as the Engine of Application State的缩写)。有了资源导航,客户端甚至可能不需要参阅文档就可以找到更多对自己有用的资源,不过HATEOAS没有固定的标准,比如:
{
"content": [ {
"price": 499.00,
"description": "Apple tablet device",
"name": "iPad",
"links": [ {
"rel": "self",
"href": "http://localhost:8080/product/1"
} ],
"attributes": {
"connector": "socket"
}
}, {
"price": 49.00,
"description": "Dock for iPhone/iPad",
"name": "Dock",
"links": [ {
"rel": "self",
"href": "http://localhost:8080/product/3"
} ],
"attributes": {
"connector": "plug"
}
} ],
"links": [ {
"rel": "product.search",
"href": "http://localhost:8080/product/search"
} ]
}
Spring框架也提供了相应的支持:https://spring.io/projects/spring-hateoas,比如如下的代码:
@RestController
public class GreetingController {
private static final String TEMPLATE = "Hello, %s!";
@RequestMapping("/greeting")
public HttpEntity greeting(
@RequestParam(value = "name", required = false, defaultValue = "World") String name) {
Greeting greeting = new Greeting(String.format(TEMPLATE, name));
greeting.add(linkTo(methodOn(GreetingController.class).greeting(name)).withSelfRel());
return new ResponseEntity<>(greeting, HttpStatus.OK);
}
}
HTTP/1.1中对幂等性的定义是:一次和多次请求某一个资源对于资源本身应该具有同样的结果(网络超时等问题除外)。
https://www.jianshu.com/p/629f0f3481bf 深入了解幂等
RPC面向过程,rest面向资源,那么GraphQL是面向数据查询。
采用GraphQL Playground(https://github.com/prisma/graphql-playground)来查看graphql端点可以看到所有支持的查询:
GraphQL就是通过Schema来明确数据的能力,服务端提供统一的唯一的API入口,然后客户端来告诉服务端我要的具体数据结构(基本可以说不需要有API文档),有点客户端驱动服务端的意思。
更多信息参见 https://github.com/chentsulin/awesome-graphql 。
在下列情况考虑RPC风格的API或说是RPC:
偏向内部的API
没有太多的时间考虑API的设计或没有架构师
提供的API很难进行资源、对象抽象
对性能有高要求
在下列情况考虑REST风格:
偏向外部API
提供的API天生围绕资源、对象、管理展开
不能耦合客户端实现
在下列情况考虑GraphQL:
客户端对于数据的需求多变
数据具有图的特点
在下列情况考虑服务端驱动:
客户端发版更新困难,需要极端的灵活性控制客户端
仅限私有API
-更多需要考虑的设计点
很多API设计指南都提到了下面这些设计考量点,也需要在设计的时候进行考虑:
版本控制,比如:
通过URI Path进行版本控制,比如https://adventure-works.com/v2/customers/3
通过QueryString进行版本控制,比如https://adventure-works.com/customers/3?version=2
通过Header进行版本控制,比如加一个请求头api-version=1
通过Media Type进行版本控制,比如Accept: application/vnd.adventure-works.v1+json
缓存策略,比如:
响应使用Cache-Control告知客户端缓存时间(max-age)、策略(private、public)
响应使用ETag来进行资源版本控制
部分响应:比如大的二进制文件需要考虑实现HEAD Method来表明资源允许分段下载,以及提供资源大小信息:
python 递归,深度优先搜索与广度优先搜索算法模拟实现
https://www.cnblogs.com/ExMan/p/11172014.html
grpc应用于微服务的分析,基于python
https://www.cnblogs.com/ExMan/p/11135025.html
grpc对go语言支持度更好,使用ptyhon,grpc只做到rpc的数据传递,其它方面大部份还要自行再架构
https://www.cnblogs.com/ExMan/p/11134966.html
x轴:水平复制,加实例
y轴:微服务拆分
z轴:分库分表
GridFS是一种在MongoDB中存储大二进制文件的机制
https://blog.csdn.net/weixin_33868027/article/details/91944478
uwsgi的一些问题
https://www.cnblogs.com/ExMan/p/10560431.html
gunicorn
https://www.cnblogs.com/ExMan/p/10560361.html
https://www.cnblogs.com/ExMan/p/10403814.html
用Python开发Zeroc Ice应用
https://www.cnblogs.com/ExMan/p/10548301.html
pycharm远程调试配置
https://www.cnblogs.com/ExMan/p/10547885.html
https://www.cnblogs.com/ExMan/p/10547881.html
机器学习
https://www.cnblogs.com/ExMan/p/10482496.html
分布式锁的几种实现方式
https://www.cnblogs.com/ExMan/p/10480761.htm
python面试常考数据结构和算法
https://www.cnblogs.com/ExMan/p/10453879.html
Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy
https://www.cnblogs.com/ExMan/p/10438842.html
Django中提供了6种缓存方式
https://www.cnblogs.com/ExMan/p/10433086.html
https://www.cnblogs.com/ExMan/p/10431451.html
https://www.cnblogs.com/ExMan/p/10431338.html
python中定时任务框架APScheduler
https://www.cnblogs.com/ExMan/p/10431069.html
https://www.cnblogs.com/ExMan/p/10426777.html
https://www.cnblogs.com/ExMan/p/10426661.html
https://www.cnblogs.com/ExMan/p/10404000.html
https://www.cnblogs.com/ExMan/p/10403827.html
https://www.cnblogs.com/ExMan/p/10403916.html
https://www.cnblogs.com/ExMan/p/10400149.html
装饰器是一道坎,不管跨不跨过去他都在那里
https://www.cnblogs.com/ExMan/p/10187645.html
https://www.cnblogs.com/ExMan/p/10187633.html
https://www.cnblogs.com/ExMan/p/9825668.html
https://www.cnblogs.com/ExMan/p/9777487.html
python利用mongodb上传图片数据 : GridFS 与 bson两种方式
https://www.cnblogs.com/ExMan/p/9712392.html
python定时任务对比
https://www.cnblogs.com/ExMan/p/9523729.html
https://www.cnblogs.com/ExMan/p/9523658.html
Django 发送email配置详解及各种错误类型
https://www.cnblogs.com/ExMan/p/9471097.html
让Django支持数据库长连接(可以提高不少性能哦)
https://www.cnblogs.com/ExMan/p/9373919.html
在生产系统使用Tornado WebServer来代替FastCGI加速你的Django应用
https://www.cnblogs.com/Alexander-Lee/archive/2011/05/02/tornado_host_django.html
django长连接https://www.cnblogs.com/ExMan/p/9373884.html
学习大牛笔记nginx + gunicorn + supervisor
https://www.cnblogs.com/ExMan/p/9371007.html
多版本Python共存时pip给指定版本的python安装package的方法
https://www.cnblogs.com/ExMan/p/9366649.html
如何自动生成和安装requirements.txt依赖
https://www.cnblogs.com/ExMan/p/9365166.html
https://www.cnblogs.com/ExMan/p/9304246.html
锁,事务
https://www.cnblogs.com/ExMan/p/9340398.html
https://www.cnblogs.com/ExMan/p/9340290.html
https://www.cnblogs.com/ExMan/p/9340215.html
https://www.cnblogs.com/ExMan/p/9340219.html
https://www.cnblogs.com/ExMan/p/9338781.html
https://www.cnblogs.com/ExMan/p/9338537.html
python时间模块time,时间戳,结构化时间,字符串时间,相互转换,datetime
https://www.cnblogs.com/ExMan/p/9295161.html
https://www.cnblogs.com/ExMan/p/9264348.html
PyCharm 使用技巧
https://www.cnblogs.com/ExMan/p/9117774.html
Django框架效率问题的解决方法
https://www.cnblogs.com/ExMan/p/8118769.html
https://www.cnblogs.com/ExMan/p/8118752.html