Python3 笔记
Ubuntu18.04 Python3环境
默认python3已经安装了, 可能是安装其他应用的时候因为依赖关系安装的.
安装pip3, 先sudo apt update 一下, apt-cache search python3-pip 看看有没有, 如果没有的话检查一下/etc/apt/sources.list 是否正确, 可以参考以下的source.list
deb http://cn.archive.ubuntu.com/ubuntu/ bionic main restricted
deb http://cn.archive.ubuntu.com/ubuntu/ bionic-updates main restricted
deb http://cn.archive.ubuntu.com/ubuntu/ bionic universe
deb http://cn.archive.ubuntu.com/ubuntu/ bionic-updates universe
deb http://cn.archive.ubuntu.com/ubuntu/ bionic multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ bionic-updates multiverse
deb http://cn.archive.ubuntu.com/ubuntu/ bionic-backports main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu bionic-security main restricted
deb http://security.ubuntu.com/ubuntu bionic-security universe
deb http://security.ubuntu.com/ubuntu bionic-security multiverse
然后通过 sudo apt install python3-pip 安装
常用的通过pip3安装的package: pymongo,
常用语法
符号
// 双斜杠表示地板除, 即先做除法/, 然后向下取整floor. 至少有一方是float时结果为float, 两方都是int时结果为int
合并两个Dictionary
x = {'aa':1, 'bb':2, 'cc':3}
y = {'aa':5, 'xx':6, 'yy':7}
z = {**x, **y}
x.update(y)
print(x)
# 输出
{'aa': 5, 'bb': 2, 'cc': 3, 'xx': 6, 'yy': 7}
{'aa': 5, 'bb': 2, 'cc': 3, 'xx': 6, 'yy': 7}
两种方法都可以实现dictionary合并, 前者不会修改原先两个dictionary的值
逻辑判断
# 空, 非空
if (x is None)
if (not x is None) # dictionary是否包含某key
if ('name' in x.keys())
if (not 'name' in x.keys())
字符串操作
# 赋值时会自动合并
y = 'Hello ' 'World'
print(y)
# substring, 截取从0到100(左边include, 右边exclude)的子串, slice方式不会报数组越界
print(y[0:3])
# Hel
print(y[0:100])
# Hello World
print(y[-2:])
# ld
用%号做字符串赋值
# 单个字符串
msg = "he is %s ,his hobby is play" %"xiaoming" # 多个值
msg = "he is %s ,his hobby is %s" %("xiaoming","play") # 百分号转义, 小数限位
tpl="percent %.2f %%" %78.7658943256 #键值对形式传字典
tpl="i am %(name)s age %(age)d" %{"name":"小明","age":"18"} '''
%c 字符及其ASCII码
%s 字符串
%d 有符号整数(十进制)
%u 无符号整数(十进制)
%o 无符号整数(八进制)
%x 无符号整数(十六进制)
%X 无符号整数(十六进制大写字符)
%e 浮点数字(科学计数法)
%E 浮点数字(科学计数法,用E代替e)
%f 浮点数字(用小数点符号)
%g 浮点数字(根据值的大小采用%e或%f)
%G 浮点数字(类似于%g)
%p 指针(用十六进制打印值的内存地址)
%n 存储输出字符的数量放进参数列表的下一个变量中
'''
用format()做字符串赋值
# 按顺序赋值
tp1 = "i am {}, age {}, {}".format("seven", 18, 'alex') # 指定序号赋值
tp3 = "i am {0}, age {1}, really {0}".format("seven", 18) # 指定名称赋值, 右侧结构为字典
tp5 = "i am {name}, age {age}, really {name}".format(name="seven", age=18) # 指定类型赋值
a1 = "numbers: {:b},{:o},{:d},{:x},{:X}, {:%},{:c}".format(15, 15, 15, 15, 15, 15.87623,65) # 指定 序号 + 类型
a2 = "numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%},{1:c}".format(15,65) # 指定 名称 + 类型
a3 = "numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%},{cc:c}".format(num=15,cc=65) ''' 可用类型
” 字符串类型 “的参数
s,格式化字符串类型数据
空白,未指定类型,则默认是None,同s
“ 整数类型 ”的参数
b,将10进制整数自动转换成2进制表示然后格式化
c,将10进制整数自动转换为其对应的unicode字符
d,十进制整数
o,将10进制整数自动转换成8进制表示然后格式化;
x,将10进制整数自动转换成16进制表示然后格式化(小写x)
X,将10进制整数自动转换成16进制表示然后格式化(大写X)
“ 浮点型或小数类型 ”的参数
e, 转换为科学计数法(小写e)表示,然后格式化;
E, 转换为科学计数法(大写E)表示,然后格式化;
f , 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
F, 转换为浮点型(默认小数点后保留6位)表示,然后格式化;
g, 自动在e和f中切换
G, 自动在E和F中切换
%,显示百分比(默认显示小数点后6位)
'''
.
List, Tuple 和 Set
tuple是不可变的, 用括号赋值(也可以不用)
# tuple的赋值
tup1 = 'str1',
tup2 = ('str1',)
tup3 = 'str1', 'str2'
tup4 = ('str1', 'str2')
tup5 = ([1,2,3], 'aa', 12345)
list是可变的, list的操作与String很像, [a:b]实际上是对原数组的复制, 下面的代码就避免了操作原列表造成无限循环
for w in words[:]: # Loop over a slice copy of the entire list.
if len(w) > 6:
words.insert(0, w)
list可以使用[[...]] 直接指定下标获得一个副本子序列, 里面的[...]也可以是表达式生成的list
# 直接下标获取子序列copy
iris_X_train = iris_X[[0,1,2,3]]
# 通过list表达式指定
iris_X_train = iris_X[indices[:-10]]
.对list做运算, 都是直接对list内的元素作运算, 例如, 求得list中每一个元素的平方, 最后得到的也是同样元素个数的list
# 求方差
square_error = (iris_y_result - iris_y_test)**2
.
常用内置函数
bin(x) 将一个整数转换为二进制值的字符串, 以 0b 开头(如果是负数则是 -0b)
enumerate() 用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列, 同时列出数据和数据下标, 一般用在 for 循环当中, 可以指定下标开始值, 如 enumerate(seasons, start=1)
id(object) 获取对象的全局唯一标识值. 注意, 如果两个对象的生命周期没有重叠, 可能会使用相同的对象id值
input(prompt) 用于命令行执行中, 暂停并弹出输入提示, 返回值是输入的字符串
len(x) 计算长度, 可以作用于序列或集合, a sequence (such as a string, bytes, tuple, list, or range) or a collection (such as a dictionary, set, or frozen set).
list(iterable) 创建一个和iterable数组的元素一样次序也一样的list
map(func, list) 接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回
zip(*iterables) 合并参数中的多个iterable里的元素, 按原顺序, 不要求元素个数一致, 但是结果中只包含最短那个的个数
常用模块
HTTP请求. Requests模块
使用手册 http://docs.python-requests.org/zh_CN/latest/api.html
使用举例
import requests def requestGet(url, encoding='UTF-8', tout=20, retries=10):
count = 0
while True:
count += 1
if (count > retries):
print('Exceed retry limit')
return None
try:
response = requests.get(url, timeout=tout)
response.encoding = encoding
return response.text
except requests.ReadTimeout:
print('ReadTimeout')
continue
except ConnectionError:
print('ConnectionError')
continue
except requests.RequestException:
print('RequestException')
continue
注意: 抓取GB2312网页时, encoding建议使用GB18030, 避免部分特殊文字乱码
Mongodb 操作. Pymongo模块
使用举例
import pymongo # 连接mongodb
client = pymongo.MongoClient('172.17.0.2', 27017)
# 选择db
db = client.db_1
# 选择collection
tb_user = db['user']
# count
total = tb_user.count_documents({})
# select one
dummy = tb_user.find_one({'_id': name})
# select all, and sort
allusers = tb_user.find().sort('posts', -1)
# insert or save
tb_user.save(user)
Collection级别的操作
# 创建索引
collection_demo.create_index([('field1', pymongo.ASCENDING)])
检查索引是否存在, 存在则删除索引
indexes = board_col.list_indexes()
for index in indexes:
print(index)
print(index['name'])
if (index['name'] == 'author_text_created_at_-1'):
board_col.drop_index('author_text_created_at_-1')
# 创建联合索引
board_col.create_index([('author', pymongo.TEXT),('created_at', pymongo.DESCENDING)])
如果要在python中直接执行mongo 命令, 需要使用 eval(), 例如以下的语句用于将多个同构的collection合并到同一个collection
for board in boards:
tb_current = rbcommon.db['deb_' + str(board['_id'])]
if (not tb_current is None):
current_total = tb_current.find().count()
print(str(board['_id']) + ', ' + board['name'] + ', ' + board['name2'] + ', ' + str(current_total))
rbcommon.db.eval('db.deb_'+ str(board['_id']) +'.find({}).forEach(function(u) {db.deb_all.save(u);})')
count_documents()的坑
对于数据量很大的collection, 尽量不要使用这个方法, 因为这个方法实际上需要遍历所有documents, 会非常慢. 可以使用 estimated_document_count() 这个方法, 这个是从collection的metadata中读取的缓存的documents数量, 如果此时collection正在写入, 可能会与实际数量有出入.
YAML配置文件读取
import yaml # 获取当前文件的路径, 注意: 是common.py路径, 不带slash, 不是引用common的文件的路径,
# 可以用 os.path.realpath(__file__) 测试
rootPath = os.path.dirname(__file__)
print(rootPath)
configPath = os.path.join(rootPath,'config.yml')
print(configPath) with open(configPath, 'r') as ymlfile:
cfg = yaml.load(ymlfile) # yaml会自动将长得像数字的值, 转换为数字类型. 下面是使用配置参数值的方式
mongoclient = pymongo.MongoClient(cfg['mongo']['host'], cfg['mongo']['port'])
db = mongoclient[cfg['mongo']['db']]
tb_section = db['section']
.
常见问题
循环中出现 pymongo.errors.CursorNotFound: cursor id xxx not found 错误
默认mongo server维护连接的时间窗口是十分钟, 默认单次从 server获取数据是101条或者 大于1M小于16M的数据, 所以默认情况下如果循环中的某步在10分钟内未能处理完数据, 则抛出异常. 解决办法为使用no_cursor_timeout = True 参数
allBoards = rbcommon.tb_board.find({}, no_cursor_timeout = True).sort('post_count', -1)
for board in allBoards:
# 0:through out mode, 1:increament mode
readBoard(board)
.
Python3 笔记的更多相关文章
- python3笔记目录大纲汇总
篇一.python3基础知识和语句 python3笔记一:python基础知识 python3笔记二:进制转换与原码反码补码 python3笔记三:运算符与表达式 python3笔记四:if语句 py ...
- 小甲鱼Python3笔记
000-愉快的开始 入门容易,学习难,代码量少. 跨平台: Windows, Mac OS, Linux, UNIX. 应用领域: 操作系统 WEB 3D动画 企业应用 云计算等等. 001-我和Py ...
- 廖雪峰Python3笔记
主要复习过一遍 简介 略 安装 略 *** 第一个Python程序 第一行的注释: # _*_ coding: utf-8 _*_ #!/usr/bin/env python3 print() 可以接 ...
- Python3笔记——常用技术点汇总
目录 · 概况 · 安装 · 基础 · 基础语法 · 数据类型 · 变量 · 常量 · 字符编码 · 字符串格式化 · list · tuple · dict · set · if语句 · for语句 ...
- python3笔记(二)Python语言基础
缩进 要求严格的代码缩进是python语法的一大特色,就像C语言家族(C.C++.Java等等)中的花括号一样重要,在大多数场合还非常有必要.在很多代码规范里面也都有要求代码书写按照一定的规则进行换行 ...
- python3笔记(一)初识Python
基础资料 什么是Python? Python官方网站 安装Python python的优点 完成同一个任务,C语言要写1000行代码,Java只需要写100行,而Python可能只要20行. pyth ...
- python3笔记
python3 Python3 基本数据类型 Python 中有六个标准的数据类型: Numbers(数字) Python可以同时为多个变量赋值,如a, b = 1, 2. 一个变量可以通过赋值指向不 ...
- python3笔记一:python基础知识
一:学习内容 注释 输入输出 标识符 变量和常量 二:注释 1. 单行注释 #:一个井号,代表我注释了这一行 2.多行注释 ''' ''':注释多行,三个单引号 3.多行注释 "" ...
- python3笔记九:python数据类型-String字符串
一:学习内容 字符串概念 字符串运算 字符串函数:eval().len().lower().upper().swapcase().capitalize().title().center().ljust ...
随机推荐
- 《剑指offer》-找到字符串中第一个只出现一个的字符
题目描述 请实现一个函数用来找出字符流中第一个只出现一次的字符.例如,当从字符流中只读出前两个字符"go"时,第一个只出现一次的字符是"g".当从该字符流中读出 ...
- [SDOI2014]数数
题解: 做过ac自动机上dp的这题应该就很容易想到了 首先在ac自动机上搞dp 表示当前考虑了i位,在自动机的j位上 然后转移就可以了 考虑限制 显然是一个数位dp 考虑位数小于n显然满足要求 考虑位 ...
- 状压dp-----三进制
三进制的状压dp要先预处理3^n以及每一个数的每一位 例题 hdu3001 题意: 给定n 个城市已经 m 条路 以及对应路费 c,要求遍历所有城市最少的路费,每个城市不能超过2次. 题解: 看代码吧 ...
- [CQOI2017]小Q的棋盘
题解: 好像有题解说可以贪心.. 显然这是一棵树,考虑树形dp 维护f[i][j]从点i往下走j再回来经过的最多点,g[i][j]从点i往下走j不用回来经过的最多点 转移方程还是挺显然的,枚举的时候像 ...
- git合并冲突解决方法
1.git merge冲突了,根据提示找到冲突的文件,解决冲突 如果文件有冲突,那么会有类似的标记 2.修改完之后,执行git add 冲突文件名 3.git commit 注意:没有-m选项 进去类 ...
- (转)获取 request 中用POST方式"Content-type"是"application/x-www-form-urlencoded;charset=utf-8"发送的 json 数据
request中发送json数据用post方式发送Content-type用application/json;charset=utf-8方式发送的话,直接用springMVC的@RequestBody ...
- Hdu-1358Period(KMP算法之next数组的应用)
题解:对于串pattern来说,如果0~i-1这个位置中循环,那么i%(i-next[i])==0 ,循环次数为 i/(i-next[i]),循环长度为 i-next[i] 例如对于串ababab来说 ...
- MAC下通过改apache配置文件切换php多版本的方法
网上关于php版本切换的文章有很多,但测试发现有很多都不行,所以不如自己想办法实现了,所以下面这篇文章主要给大家介绍了在MAC系统下通过改apache配置文件的方法来使php多版本切换的相关资料,需要 ...
- P1292 倒酒
P1292 倒酒这个题有很多模型,这个是一个变形.我令一个解为x两个整数Pa和Pb,分别表示从体积为a ml的酒杯中倒出酒的次数和将酒倒入体积为b ml的酒杯中的次数(酒杯一开始为空).b最后是0,所 ...
- python 批量替换文件名
你要是这样学习看到这种恶心不, 需求来了,批量替换文件名 movie_name = os.listdir('H:\妙味课堂') # 获取所有的文件名列表 # Node+TS+Koa+vue[编程开发] ...