*跳转到文章结尾*
https://www.cnblogs.com/Asterism-2012/p/10047356.html
注释的学问
python源于圣诞节,他的创造者是Guido van Rossum(贤者-龟叔)。
常用操作:
在Pycharm中配置为我们的虚拟环境
先后点击:file—settings—Project-----project Interpreter用的时间长了自然就会了。
┌────────────────────────────────────────────────────────┐
│Command Prompt - python _ □ x │
├────────────────────────────────────────────────────────┤
│>>> print("Here not a world.") │
│Here not a world. │
│>>> _ │
│ │
│ │
│ by: Asterism2012 |
└────────────────────────────────────────────────────────┘
第一象限:紧急重要·赶紧搞定
第二象限:重要,不紧急·保持关注
第三象限:紧急不重要·学会拒绝
第四象限:不紧急,不重要·靠自律
——来自知道创宇技能表·受益匪浅
第一阶段:“计算机系统结构阶段”,由1946年开始,持续了35年,直到1981年。
第二阶段:“计算机网络和视窗阶段”。由1982年开始,直到2007年。持续了25年。
第三阶段:“复杂信息系统阶段”,这个阶段由2008年发展至今。
第四阶段:约2035年左右,步入“人工智能阶段”:
问题:
Python是一种计算机编程语言。计算机编程语言和我们日常使用的自然语言有所不同,最大的区别就是,自然语言在不同的语境下有不同的理解,而计算机要根据编程语言执行任务,就必须保证编程语言写出的程序决不能有歧义,所以,任何一种编程语言都有自己的一套语法,编译器或者解释器就是负责把符合语法的程序代码转换成CPU能够执行的机器码,然后执行。——廖雪峰
>>>dic1 = dict()
>>>set1 = set()
>>>lis1 = list()
查看一下类型
>>> type(dic1)
<class 'dict'>
>>> type(lis1)
<class 'list'>
>>> type(set1)
<class 'set'>
返回目录
代码注释在每一个高级语言中都存在,用于用我们人的语言来为我们写的代码进行标注,提高我们代码的可读性,从而提高我们协同工作的效率,以及降低我们的维护代码的时间成本。
#
号):# 我是一段注释,我写的代码意思是这样的
''' '''
三引号):'''我是多行注释,我是可以换行显示的,
你看,我换行了'''
值得一提的是:多行注释不能放在在列表、集合、字典中:
dic1 = { │ lis1 = [ │set1 = {
'''Student dict''' │ '''New List''' │ '''New set'''
'name':'Tom', │ 1, │ 1,
'age':'18' # No │ 2 # No │ 2, # No
} │] │}
上面这种写法都是错误的。在容器类型的数据类型中,三引号囊括起来的内容会被视为字符串。
但是单行注释是被允许的:
set1 = [
# New set
1,2
]
像这样写是可以的,可以自己打印这些变量尝试一下。
给导入的标准包起名
from lxml import etree as e
list = ["M","i","s","s"]
函数名其实就是指向一个函数对象的引用,完全可以把函数名赋给一个变量,相当于给这个函数起了一个“别名”:
max函数max()可以接收任意多个参数,并返回最大的那个:
>>> max(1, 2)
2
>>> max(2, 3, 1, -5)
3
range(start,stop,step)
start:计数从start开始,默认为0.
stop:计数到stop结束,但不包括stop。
step:计数跨度,默认为1。
指定一个参数
range(8)
[0, 1, 2, 3, 4, 5, 6, 7]
指定两个参数
range(1,15)
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
指定三个参数
range(1,100,20)
[1, 21, 41, 61, 81]
支持负参数(越来越小)
range(-10,-20,-1)
[-10, -11, -12, -13, -14, -15, -16, -17, -18, -19]
倒序
range(100,19,-5)
[100, 95, 90, 85, 80, 75, 70, 65, 60, 55, 50, 45, 40, 35, 30, 25, 20]
指定参数0
range(0)
[]
不指定参数
range()
Traceback (most recent call last):
File “”, line 1, in
TypeError: range expected at least 1 arguments, got 0
range()被视为一个range类型(范围)的对象,使用type()函数则会看到
type(range(0))
使用help()函数则会看到
Help on class range in module builtins:
class range(object)
| range(stop) -> range object
| range(start, stop[, step]) -> range object
在Python3中进行操作,不会返回列表,而是范围对象的内容。
range(0)
range(0, 0)range(-10,-20,-1)
range(-10, -20, -1)range(1)
range(0, 1)range(10,100,20)
range(10, 100, 20)
re.match(正则表达式)
# 普通替换
>>>result = re.sub("d+","Hi",'123 world')
>>>result
Hi world
'''进阶替换(插入)
包含源字符串本身的内容 规定原生(字符串)的r与Back slash slash(“\”)转义来保证字符串的正确性'''
>>>result = re.sub("(\d+)",r"\1 123","456")
>>>result
456 123
result.group(x) #获取正则表达式中第x个括号中的字符串内容
>>>result = re.match('.*(\d+)',"a123")
>>>result.group(1)
a12
>>>result = re.match('.*(\d+)',"a123")
>>>result.group(1)
a
re.match('Hello \$world.','Hello $world.')
通过生成式生成
通过函数生成
通过生成式生成
generator = (i for i in range(10))
类型检查type()
>>> type(generator)
直接打印
>>> generator
at 0x000002962143B938>
帮助信息
Help on generator object:
= class generator(object)
'''
译文:生成器的帮助信息:
'''
>>>datelis = ["10月{}日".format for i in range(1,32)]
>>>datelis
['10月1日', '10月2日', '10月3日', '10月4日', '10月5日', '10月6日', '10月7日', '10月8日', '10月9日', '10月10日', '10月11日', '10月12日', '10月13日', '10月14日', '10月15日', '10月16日', '10月17日', '10月18日', '10月19日', '10月20日', '10月21日', '10月22日', '10月23日', '10月24日', '10月25日', '10月26日', '10月27日', '10月28日', '10月29日', '10月30日', '10月31日']
>>>dicgene = {i:i for i in range(20)} # 最常规字典推导式
>>>dicgene
{0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, 10: 10, 11: 11, 12: 12, 13: 13, 14: 14, 15: 15, 16: 16, 17: 17, 18: 18, 19: 19}
>>>dicgene2 = {index:i for i in enumerate(datelis)} # 常规的 用字典排序列表
>>>dicgene2
{0: '10月1日', 1: '10月2日', 2: '10月3日', 3: '10月4日', 4: '10月5日', 5: '10月6日', 6: '10月7日', 7: '10月8日', 8: '10月9日', 9: '10月10日', 10: '10月11日', 11: '10月12日', 12: '10月13日', 13: '10月14日', 14: '10月15日', 15: '10月16日', 16: '10月17日', 17: '10月18日', 18: '10月19日', 19: '10月20日', 20: '10月21日', 21: '10月22日', 22: '10月23日', 23: '10月24日', 24: '10月25日', 25: '10月26日', 26: '10月27日', 27: '10月28日', 28: '10月29日', 29: '10月30日', 30: '10月31日'}
下文的一部分time代表的是datetime类型的对象
>>>now = time.time()
1540374057.6383073
>>>time.localtime(time.time())
time.struct_time(tm_year=2018, tm_mon=10, tm_mday=24, tm_hour=17, tm_min=42, tm_sec=44, tm_wday=2, tm_yday=297, tm_isdst=0)
>>>time.strftime("%Y%m%d %H:%M:%S",time.localtime(time.time()))
'20181024 18:00:21'
下文的一部分datetime 代表的是datetime类型的对象
获取当前时间:datetime.now()
from datetime import datetime
now = datetime.now()
print(now)
2018-10-23 14:36:14.238998
获取datetime对象的
格式符 说明
%a 星期的英文单词的缩写:如星期一, 则返回 Mon
%A 星期的英文单词的全拼:如星期一,返回 Monday
%b 月份的英文单词的缩写:如一月, 则返回 Jan
%B 月份的引文单词的缩写:如一月, 则返回 January
%c 返回datetime的字符串表示,如03/08/15 23:01:26
%d 返回的是当前时间是当前月的第几天
%f 微秒的表示: 范围: [0,999999]
%H 以24小时制表示当前小时
%I 以12小时制表示当前小时
%j 返回 当天是当年的第几天 范围[001,366]
%m 返回月份 范围[0,12]
%M 返回分钟数 范围 [0,59]
%p 返回是上午还是下午–AM or PM
%S 返回秒数 范围 [0,61]。。。手册说明的
%U 返回当周是当年的第几周 以周日为第一天
%W 返回当周是当年的第几周 以周一为第一天
%w 当天在当周的天数,范围为[0, 6],6表示星期天
%x 日期的字符串表示 :03/08/15
%X 时间的字符串表示 :23:22:08
%y 两个数字表示的年份 15
%Y 四个数字表示的年份 2015
%z 与utc时间的间隔 (如果是本地时间,返回空字符串)
%Z 时区名称(如果是本地时间,返回空字符串)
%% %号本身
作者:ShomyLiu
来源:CSDN
原文:https://blog.csdn.net/shomy_liu/article/details/44141483
版权声明:本文为博主原创文章,转载请附上博文链接!
使用strftime获取当前时间的日期部分:%x
from datetime import datetime
now = datetime.now()
date = now.strftime("%x")
‘10/23/18’
获取单独的 年 月 日 部分:datetime.year(),datetime.month(),datetime.day()
now.year
2018now.month
10now.day
23
strftime()可以自定义格式化标准
now.strftime("%x %X")
‘10/23/18 14:52:20’
trptime是python datetime库中的函数,用于将一个日期字符串转成datetime日期格式便于后期处理,使用格式为datetime.strptime(date_string, format);格式化(format)使用的参数与上面所讲的strftime()所用的格式化参数是一样的,但是它要与字符串位置一一对应才行。
timedelta()是datetime()这个超类内置的方法,用于计算过去的时间,返回一个datetime.timedelta()类型的变量。
import datetime
>>> loseTime = datetime.timedelta(days=-1)
>>> loseTime
datetime.timedelta(-1)
# 也可以是一周前,大家举一反三吧
# >>>loseTime = datetime.timedelta(weeks=-1)
>>> nowTime = datetime.datetime.now()
>>> nowTime
datetime.datetime(2018, 10, 25, 18, 53, 23, 108495)
>>> that_time = nowTime+loseTime
>>> that_time
datetime.datetime(2018, 10, 24, 18, 53, 23, 108495) # 时间变化了!看到没?
所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:
PI = 3.14159265359
但事实上PI仍然是一个变量,Python根本没有任何机制保证PI不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量PI的值,也没人能拦住你。(----来自:廖雪峰的官方网站 https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431658624177ea4f8fcb06bc4d0e8aab2fd7aa65dd95000)
*args和与**kwargs
* 和**
这两个符号影响,而*args和**kwargs
只是约定的非强制性的。也就是说,arg和kwargs这两个名字并不是必须叫这个名字的,而*号是必须有的。*args 和**kwargs
可以单独使用*args和**kwargs
可以一起使用*args必须在**kwargs
前面*
会把list或者tuple分解为一个个参数传递给函数**
会把dict转成关键字参数* 或者**
*args
是不带keyd容器及字符串,**kwargs
是带‘key’的容器。*args
匹配多个元素,kwargs
匹配键值对。*args不定长参数案例
def func(*args):
print(args)
print(type(args))
func(1,2,‘a’)
(1, 2, ‘a’)
**kwargs不定长参数案例
def func(**kwargs):
print(kwargs)
print(type(kwargs))
func(a=1,b=2)
{‘a’: 1, ‘b’: 2}
空的案例
大多数时候,只有一个容器被调用的时候,才能健康地使用*
号进行拆包
单*号拆包
list1 = [1,2,3]
print(*list1)
双*号拆包
dict1 = {‘a’:1,‘b’:2}
def func(a,b):
print(a,b)
func(**dict1)
它用于进行检查某一个变量的类型,但他是type()函数的高阶版本。它拥有更强大的功能,同时也拥有更多的发挥空间。
检测单个变量是否为某个类型
dic1 = {‘a’:‘z’}
isinstance(dic1,dict) # 这一行是判断dic1变量是否为字典类型
Trueisinstance(dic1,tuple) # 这一行是判断dic1变量是否为元祖类型
False
检测单个变量是否在所指定的类型范围内
‘’‘判断dic1是否是:
整型、浮点型、字符串、列表、集合、字典、元祖类型中的一种
‘’’
isinstance(dic1,(int,float,str,list,set,dict,tuple))
True
‘’‘判断dic1是否是:
整型、浮点型、字符串、列表、集合、元祖类型中的一种
‘’’isinstance(dic1,(int,float,str,list,set,tuple))
False
检测多个变量是否在指定的类型范围内
dic1 = {‘a’:‘z’}
dic2 = {‘c’:‘w’}
isinstance((dic1,dic2),(int,float,str,list,set,dict,tuple))
Trueisinstance((dic1,dic2),(int,float,str,list,set,tuple))
False
最常用的七种数据类型
最后值得一提的是,此函数在Python2.x版本和Python3.x版本中,没有版本差异。
d = '新建文件夹'
if not os.path.exists(d):
os.mkdir(d)
__file__
print(__file__) # 不要以命令的形式执行它,告诉你,执行不了!...刚才不是我
默认是斜杠
pth = os.path.dirname('C:/Users/DELL/Desktop/test.py')
print(pth)
Console:
C:/Users/DELL/Desktop
os.path.dirname 是比较动摇的,它传入的路径字符串里用的是反斜杠,它打印出来就是反斜杠。但是如果传入的路径字符里用的是斜杠,它打印出来的就是斜杠。
os.path.abspath()
os.path.abspath 是非常坚定的(绝对路径,绝对懂吗?非常绝对)它不论你传入的是路径字符串励用的是反斜杠还是斜杠,他打印出来都是反斜杠~~~~ 额刚才不是我。算了太晚了 该睡了。
os.path.join("C:/User/DELL/Desktop", "test.py")
import shelve
f = shelve.open("shelve_test")
f['info'] = "alex"
f["age"] = [1,34,5,6,33,44]
f["name"] = {"name":"alex","add":"sz"}
f.close()
f = shelve.open("shelve_test")
print(f.get("info"))
print(f.get("age"))
print(f.get("name"))
print(f['info'])
print(f.values())
print(f.items())
print(f.keys())
import shelve
with shelve.open("test_shelve.db") as f:
f["k1"] = {
"name":"zhangguojun1",
"age":12,
"address":"shenzhen1"
}
f["k4"] = ["张国军1","张国军2","张国军3"]
print(f["k1"]["name"])
print(f["k4"][0])
字典.get(“键”,异常值)
dict.items() 以列表返回可便利的(键、值)元祖数据,仍是一个字典对象
for v,j in dict.items:
print(v,j)
list1 = [1,2,3]
randint = random.choice(list1)
>>>import random
>>>a = random.randrange(1,999)
>>>a
85
今天先把Python三大特性之一的“封装”特性放在一边。聊一聊继承与多态,简单的来说,继承与多态是体现在面向对象编程中的类编程上。
class Animals(object): # object 是 Animals的父类
def run(self,name="Animals"):
print("%s are running.")
class Cats(Animals): # Animals是Cats的父类
def run(self,name="Cats"):
print("%s are running.")
cats = Cats() # 实例化Animals 的子类 Cats
cats.run() # run方法体现继承,console: Cats are running.
# 这体现了cats的数据类型是Animals
list0727 = []
print(isinstance(list0727,list)) # console:True
print(isinstance(cats,Cats)) # console:True
print(isinstance(cats,Animals)) # console:True
def run_twice(animals): # 这里的形参名称是自己定义的,可以改成别的名称,但是这里只是为了方便我们记忆。
animals.run()
run_twice(Cats()) # console: Cats is running.
'''接下来可以体现 动态语言 的 鸭子类型:
它并不要求严格的继承体系,一个对象只要“看起来像鸭子,走起路来像鸭子”,那它就可以被看做是鸭子。
'''
class People(objects):
def run(self):
print("People are running.")
run_twice(People())
'''在静态语言中(例如),如果要传入animals类型的参数,则传入的对象必须是animals类型 或者是它的子类,否则,将无法调用run()方法。
但是,对于Python这样的动态语言来叔,则不需要传入Animal类型。我们只需要保证传入的对象有一个run()方法就够了。
'''
这一小节来自于“廖雪峰的官方网站” https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431865288798deef438d865e4c2985acff7e9fad15e3000
Python版本:Python3.5
pymysql 是一个第三方包 pip install pymysql
建立数据库连接,并获取对象
db = pymysql.connect(user=‘root’,password=‘mysql’,db=‘233’,charset=‘utf8’)
建立游标
cursor = db.cursor()
编写sql语句
sql = ‘insert into ding(title,author,new_chapter,w_num,u_time,status)value("{}","{}","{}","{}","{}","{}")’.format(title,author,new_chapter,w_num,u_time,status)
使用游标执行语句
cursor.excute(sql)
提交事务
db.commit()
Python版本:python3.5
确保pymsql的安装 pip install
建立连接并且获取到连接对象
myconn = pymongo.MongoClient(“localhost”,27017)
生成数据库
mydb = myconn[“LagouWeb”]
生成集合
mycoll = mydb[“zhaopin”]
将文档(必须是字典类型的数据)存入集合
info = {key:value}
mycoll.insert(info)
##字符串方法
str.split(" ",3) 表示以空格来切,字符串,将其切成列表,只切前三个(第二个参数是可选的,就是可以不填写)
str.startswith(" ") 表示检查字符串是否是以指定子字符串开头,如果是则返回 True,否则返回 False。如果参数 beg 和 end 指定值,则在指定范围内检查。(str.startswith(str, beg=0,end=len(string))
操作系统:windows10
为什么使用虚拟环境?搭建独立python运行环境。防止相同包的不同版本之间相互冲突和覆盖。
virtualenv是是python的虚拟环境管理器
md virtual_now(会在当前目录创建一个名为‘virtual_now’的子文件夹)
cd virtual_now
pip install virtualenv(pip是python的包管理工具)
virtualenv --no-site-packages newenv
(像创建文件夹一样创建了一个环境目录‘newenv’)
#关于--no-site-pakeages参数#:它不会复制已存在的第三方包
使用指定Python解释器的方式创建环境:
virtualenv -p c:\python27\python.exe venv
cd Scripts
activate(激活环境)
pip install django==1.11.1
python
7.退出虚拟环境
deactivate
virtualenvwrapper可以简化virtualenv包的操作
pip install virtualenvwrapper-win
C:\workon
Pass a name to activate one of the following virtualenvs:
==============================================================================
设置系统环境变量(WIN10的话直接新建就可以),后面添加自己想要的虚拟环境目录位置。
┌────────────────────────────────────────────────────────┐
│ Edit system variables _ □ x │
├────────────────────────────────────────────────────────┤
│ ┌──────────────────────────────────┐ │
│ Variable Name(N) │ WORKON_HOME │ │
│ └──────────────────────────────────┘ │
│ ┌──────────────────────────────────┐ │
│ Variable Value(V) │ E:\virtual_now │ │
│ └──────────────────────────────────┘ │
│ ┌────────┐ ┌────────┐ │
│ │ OK │ │ Cancel │ │
│ └────────┘ └────────┘ │
└────────────────────────────────────────────────────────┘ by: Asterism
C:\mkvirtualenv Py3_django2
以指定python3环境的方式建立虚拟环境
C:\mkvirtualenv -p python3 venv
C:\workon Py3_django2
C:\lsvirtualenv
C:\deactivate
C:\cdsitepackages
C:\lssitepackages
C:\wipeenv
C:\rmvirtualenv Py3_django2
C:\cpvirtualenv Py3_django2
C:\> setvirtualenvproject Py3_django2
部分参考:
作者:lliuz
来源:CSDN
原文:https://blog.csdn.net/melpancake/article/details/54578711
版权声明:本文为博主原创文章,转载请附上博文链接!
virtualenvwrapper-win is a port of Dough Hellman’s virtualenvwrapper to Windows
batch scripts.
(virtualenvwrapper-win是Dough Hellman开发的 windows操作系统的
批处理脚本。)
Commands available:
(可用命令:)
add2virtualenv: add directory to the import path
cdproject: change directory to the active project
cdsitepackages: change to the site-packages directory
cdvirtualenv: change to the $VIRTUAL_ENV directory
lssitepackages: list contents of the site-packages directory
lsvirtualenv: list virtualenvs
mkproject: create a new project directory and its associated virtualenv
mkvirtualenv: Create a new virtualenv in $WORKON_HOME
rmvirtualenv: Remove a virtualenv
setprojectdir: associate a project directory with a virtualenv
toggleglobalsitepackages: turn access to global site-packages on/off
virtualenvwrapper: show this help message
whereis: return full path to executable on path.
workon: list or change working virtualenvs
操作系统:Linux
sudo pip install virtualenv (安装)
sudo pip install virtualenvwrapper (打包安装)
(python2) mkvirtualenv [环境名]
(python3) mkvirtualenv -p python3 [环境名]
workon (查询)
workon [虚拟环境名] (使用)
deactivate (退出虚拟环境)
rmvirtualenv (删除虚拟环境)
which python
where python
pip install 包名
pip install 包名==版本号
pip uninstall 扩展报名
pip freeze
pip freeze >
pip list
pip freeze > requirements.txt
pip install -r requirements.txt
国内源:
阿里云 http://mirrors.aliyun.com/pypi/simple/
中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
豆瓣(douban) http://pypi.douban.com/simple/
清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
pip install -i http://pypi.douban.com/simple 模块名
如果出现不信任的报错,则需要在命令后加上:
pip install -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 模块名
#!/usr/bin/env python与#!/usr/bin/python的区别(/bin/可执行文件)
脚本语言的第一行,++目的就是指出++,你想要你的这个++文件中的代码用什么可执行程序去运行++它,
#!/usr/bin/python
是告诉操作系统执行这个脚本的时候,调用/usr/bin下的python解释器;
#!/usr/bin/env python
这种用法是为了++防止操作系统用户没有将python装在默认的/usr/bin路径++里。当系统看到这一行的时候,首先会到env设置里查找python的安装路径,再调用对应路径下的解释器程序完成操作。
(#!/usr/bin/python
相当于写死了python路径;
#!/usr/bin/env python
会去环境设置寻找python目录:推荐这种写法。)
尊重版权:转载自博客园 https://www.cnblogs.com/walk1314/p/7076853.html (Mr_Walker),如需转载请注明出处,尊重他人的劳动成果,也尊重你自己。
lambda argument_list: expression
这里的argument_list是参数列表。它的结构与Python中函数(function)的参数列表是一样的。具体来说,argument_list可以有非常多的形式。例如
这里的expression是一个关于参数的表达式。表达式中出现的参数需要在argument_list中有定义,并且表达式只能是单行的。以下都是合法的表达式:expression:不能包含分支或循环(但允许条件表达式),也不能包含return(或yield)函数。如果为元组,则应用圆括号将其包含起来。
三个特性lambda函数有如下特性:
四个用法
time.sleep=lambda x:None
'''后续代码中调用time库的sleep函数将不会执行原有的功能。例如,执行time.sleep(3)时,程序不会休眠3秒钟,而是什么都不做。括号中的x代表这个标准库函数的原本形参。'''
return lambda x,y:x+y
'''。这时,lambda函数实际上是定义在某个函数内部的函数,称之为嵌套函数,或者内部函数。对应的,将包含嵌套函数的函数称之为外部函数。内部函数能够访问外部函数的局部变量,这个特性是闭包(Closure)编程的基础,在这里我们不展开。'''
filter(lambda x: x % 3 == 0, [1, 2, 3])
sorted函数。此时lambda函数用于指定对列表中所有元素进行排序的准则。例如sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(5-x))将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]按照元素与5距离从小到大进行排序,其结果是[5, 4, 6, 3, 7, 2, 8, 1, 9]。
map函数。此时lambda函数用于指定对列表中每一个元素的共同操作。例如map(lambda x: x+1, [1, 2,3])将列表[1, 2, 3]中的元素分别加1,其结果[2, 3, 4]。
reduce函数。此时lambda函数用于指定列表中两两相邻元素的结合条件。例如reduce(lambda a, b: '{}, {}'.format(a, b), [1, 2, 3, 4, 5, 6, 7, 8, 9])将列表[1, 2, 3, 4, 5, 6, 7, 8, 9]中的元素从左往右两两以逗号分隔的字符的形式依次结合起来,其结果是'1, 2, 3, 4, 5, 6, 7, 8, 9'。
事实上,关于lambda在Python社区是存在争议的。Python程序员对于到底要不要使用lambda意见不一致。
作者:独孤球是
来源:CSDN
原文:https://blog.csdn.net/zjuxsl/article/details/79437563?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文链接!
>>>pf = lambda x:x**2
>>>pf(1)
1
>>>pf(2)
4
求几个数之和的匿名函数
f = lambda *args:sum(args)
f(1,2,3,4)
10
函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表。
该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。
filter(function, iterable)
def is_odd(n):
return n % 2 == 1
newlist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
print(newlist)
print()
print()函数接收很多参数,我们需要主要学习的是sep,end,file这个三个参数;可以在源码中看到,他们的默认值是:
sep=' ', end='\n', file=None
sep是改变多个输出内容的分隔符,end是改变输出末尾的换行,file则是输出到一个文件
- file参数
# file参数指向的应该是一个文件对象 with open("new.txt","a+") as f: print("Print over.",file=f) # 这样可以将输出内容打印到一个文件中去
遍历索引:当遍历一个可迭代对象时候,使用此函数可以提供遍历索引。
>>>for index,name in all_name:
... print(index,name)
1 tom
2 lily
3 alice
...
在python编程时操作文件与目录、以及使用shell命令,就需要os模块的支持。os模块包含普遍的操作系统功能,与具体的平台无关。
sms_code = "%06d" % random.randint # 生成验证码
from django_redis import get_redis_connection
redis_conn = get_redis_connection
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/0",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
"session": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
},
# 图片验证码的redis
"verify_codes": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "session"
# 使用redis的pipeline管道一次执行多个命令
pl = redis_conn.pipeline()
# 保存短信验证码
redis_conn.setex('sms_%s' % mobile, constants.SMS_CODE_REDIS_EXPRIES, sms_code)
# 保存当前的时间,只是做个记录而已,60s过期
redis_conn.setex('sms_interval', constants.SMS_CODE_REDIS_INTERVAL, datetime.now())
# 让管道执行命令
pl.execute()
itsdangerous(它是危险的),顾名思义。以下是来自官方网站的介绍。
(Py_Django2.0.6) C:\Users\DELL\Desktop\meiduo-email>pip install itsdangerous
>>> from itsdangerous import Signer # 导入Signer方法
>>> s = Signer('secret-key') # 实例化一个以‘secret-key’为密钥的对象
>>> s.sign('my string') # 使用这个对象含有的密钥 使用字符串生成签名
b'my string.wh6tMHxLgJqB6oY1uT73iMlyrOA' # 这一步是可逆的
>>> s.unsign('my string.wh6tMHxLgJqB6oY1uT73iMlyrOA') # 对这个签名进行转码
b'my string'
它继承了JSONWebSignatureSerializer类。
首先我们来看生成令牌和解码令牌的代码:
from itsdangerous import TimedJSONWebSignatureSerializer
s = TimedJSONWebSignatureSerializer(app.config['SECRET_KEY'], expires_in=3600)
token = s.dumps({'confirm': 23})
data = s.loads(token)
---------------------
作者:她叫徐晓jie
来源:CSDN
原文:https://blog.csdn.net/sinat_34927324/article/details/78378911
版权声明:本文为博主原创文章,转载请附上博文链接!
我们老师的老大使用这个模块生成了token,并且对它进行了解密。
def generate_email_verify_url(self):
serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=24*60*60) # 生成token
data = {'user_id': self.id, 'email': self.email}
token = serializer.dumps(data).decode()
verify_url = 'http://127.0.0.1:8080/success_verify_email.html?token=' + token
return verify_url
解密。
@staticmethod # 类可以直接调用
def check_email_verify_token(token):
"""
检查验证邮件的token
"""
serializer = TJWSSerializer(settings.SECRET_KEY, expires_in=300)
try:
data = serializer.loads(token) # 对token进行解码
except BadData:
return None
else:
email = data.get('email')
user_id = data.get('user_id')
User.objects.filter(id=user_id, email=email).update(email_active=True)
return True
英[paɪ’θɒnɪk] 美[paɪ’θɒnɪk]
adj. 神谕的,预言的,大蟒似的;
Pythoner们常说,写代码要写得Pythonic一些,那么什么是Pythonic呢?Pythonic其实是一种编码风格。瞧瞧这翻译,够酷炫的。神谕的,什么是神谕?那是神说的话,神说话,一向简单简短又充满哲理。这就是我们写Python程序要达成的目标,Python代码应该写的简短又精彩。
import this
就会显示Tim Peters的The Zen of python
>>> import this
The Zen of Python, by Tim Peters
Beautiful is better than ugly.
Explicit is better than implicit.
Simple is better than complex.
Complex is better than complicated.
Flat is better than nested.
Sparse is better than dense.
Readability counts.
Special cases aren't special enough to break the rules.
Although practicality beats purity.
Errors should never pass silently.
Unless explicitly silenced.
In the face of ambiguity, refuse the temptation to guess.
There should be one-- and preferably only one --obvious way to do it.
Although that way may not be obvious at first unless you're Dutch.
Now is better than never.
Although never is often better than *right* now.
If the implementation is hard to explain, it's a bad idea.
If the implementation is easy to explain, it may be a good idea.
Namespaces are one honking great idea -- let's do more of those!
Python之禅 by Tim Peters
优美胜于丑陋(Python 以编写优美的代码为目标)
明了胜于晦涩(优美的代码应当是明了的,命名规范,风格相似)
简洁胜于复杂(优美的代码应当是简洁的,不要有复杂的内部实现)
复杂胜于凌乱(如果复杂不可避免,那代码间也不能有难懂的关系,要保持接口简洁)
扁平胜于嵌套(优美的代码应当是扁平的,不能有太多的嵌套)
间隔胜于紧凑(优美的代码有适当的间隔,不要奢望一行代码解决问题)
可读性很重要(优美的代码是可读的)
即便假借特例的实用性之名,也不可违背这些规则(这些规则至高无上)
不要包容所有错误,除非你确定需要这样做(精准地捕获异常,不写 except:pass 风格的代码)
当存在多种可能,不要尝试去猜测
而是尽量找一种,最好是唯一一种明显的解决方案(如果不确定,就用穷举法)
虽然这并不容易,因为你不是 Python 之父(这里的 Dutch 是指 Guido )
做也许好过不做,但不假思索就动手还不如不做(动手之前要细思量)
如果你无法向人描述你的方案,那肯定不是一个好方案;反之亦然(方案测评标准)
命名空间是一种绝妙的理念,我们应当多加利用(倡导与号召)
出自:意气相许的许
链接:https://www.jianshu.com/p/0e1f38c2c122
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
*返回目录再看看*