标签:
1.双层装饰器
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author:zml
LOGIN_INFO
=
False
IS_ADMIN
=
False
def
check_log(func):
def
inner():
res
=
func()
if
LOGIN_INFO:
print
(
‘验证成功!‘
)
return
res
else
:
print
(
‘验证失败!‘
)
return
inner
def
check_admin(func):
def
inner():
res
=
func()
if
IS_ADMIN:
print
(
‘欢迎管理员!‘
)
return
res
else
:
print
(
‘权限不足!‘
)
return
inner
@check_log
@check_admin
def
login():
inp
=
input
(
‘请输入您的用户名:‘
)
if
inp
=
=
‘admin‘
:
global
LOGIN_INFO
global
IS_ADMIN
LOGIN_INFO
=
True
IS_ADMIN
=
True
else
:
print
(
‘正在尝试登录:{name}‘
.
format
(name
=
inp))
login()
双层装饰器,执行顺序是从上往下执行。返回顺序是和调用顺序相反的
2.python模块
python模块,类似其他语言中的类库,个人理解就是封装了很多函数的类。
他能帮你完成常用功能,减少开发成本
python模块分类
自定义模块
第三方模块
内置模块
1.自定义模块
1.1定义模块
1.2其他文件导入模块
1.3执行结果
1.4python第三方模块安装方式
1.pip安装
2.源码包安装
1.pip3 install 模块名
2.下载源码包,查看readme文件,安装模块
python3 setup.py install
2.1pytho模块导入方式
import
module(模块) 导入整个模块
from
module.xx.xx
import
xx
from
模块
import
模块方法 导入模块指定方法
from
module.xx.xx
import
xx as rename 导入模块指定方法,如果导入模块名称出现重名。可以重命名
from
module.xx.xx
import
* 导入模块的所有方法
单模块建议使用import导入
如果只使用模块中的某个特定的方法,建议使用from导入模块
导入模块路径是根据sys模块下的path方法中存在的列表路径
如果sys.path路径列表没有你想要的路径,可以通过 sys.path.append(‘路径‘) 添加。
2.2python内置模块
2.2.1sys模块
sys.argv 命令行参数
List
,第一个元素是程序本身路径
sys.exit(n) 退出程序,正常退出时exit(
0
)
sys.version 获取Python解释程序的版本信息
sys.maxint
最大的
Int
值python3已废弃
sys.path 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.platform 返回操作系统平台名称
sys.stdin 输入相关
sys.stdout 输出相关
sys.stderror 错误相关
2.2.2os模块
os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径
os.chdir(
"dirname"
) 改变当前脚本工作目录;相当于shell下cd
os.curdir 返回当前目录: (
‘.‘
)
os.pardir 获取当前目录的父目录字符串名:(
‘..‘
)
os.makedirs(
‘dir1/dir2‘
) 可生成多层递归目录
os.removedirs(
‘dirname1‘
) 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
os.mkdir(
‘dirname‘
) 生成单级目录;相当于shell中mkdir dirname
os.rmdir(
‘dirname‘
) 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
os.listdir(
‘dirname‘
) 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印
os.remove() 删除一个文件
os.rename(
"oldname"
,
"new"
) 重命名文件
/
目录 当重命名文件存在是报错
os.stat(
‘path/filename‘
) 获取文件
/
目录信息
os.sep 操作系统特定的路径分隔符,win下为
"\\",Linux下为"
/
"
os.linesep 当前平台使用的行终止符,win下为
"\t\n"
,Linux下为
"\n"
os.pathsep 用于分割文件路径的字符串
os.name 字符串指示当前使用平台。win
-
>
‘nt‘
; Linux
-
>
‘posix‘
os.system(
"bash command"
) 运行shell命令,直接显示。win可使用dos命令,linux使用shell
os.environ 获取系统环境变量
os.path.abspath(path) 返回path规范化的绝对路径
os.path.split(path) 将path分割成目录和文件名二元组返回
os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.basename(path) 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即
os.path.split(path)的第二个元素
os.path.exists(path) 如果path存在,返回
True
;如果path不存在,返回
False
os.path.isabs(path) 如果path是绝对路径,返回
True
os.path.isfile(path) 如果path是一个存在的文件,返回
True
。否则返回
False
os.path.isdir(path) 如果path是一个存在的目录,则返回
True
。否则返回
False
os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.getatime(path) 返回path所指向的文件或者目录的最后存取时间
os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间
3.字符串格式化
Python的字符串格式化有两种方式: 百分号方式、format方式
百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存。[PEP-3101]
This PEP proposes a new system for built-in string formatting operations, intended as a replacement for the existing ‘%‘ string formatting operator
1、百分号方式
%[(name)][flags][width].[precision]typecode
注:Python中百分号格式化是不存在自动将整数转换成二进制表示的方式
常用格式化:
tpl
=
"i am %s"
%
"alex"
tpl
=
"i am %s age %d"
%
(
"alex"
,
18
)
tpl
=
"i am %(name)s age %(age)d"
%
{
"name"
:
"alex"
,
"age"
:
18
}
tpl
=
"percent %.2f"
%
99.97623
tpl
=
"i am %(pp).2f"
%
{
"pp"
:
123.425556
, }
tpl
=
"i am %.2f %%"
%
{
"pp"
:
123.425556
, }
2、Format方式
[[fill]align][sign][#][0][width][,][.precision][type]
常用格式化:
tpl
=
"i am {}, age {}, {}"
.
format
(
"seven"
,
18
,
‘alex‘
)
tpl
=
"i am {}, age {}, {}"
.
format
(
*
[
"seven"
,
18
,
‘alex‘
])
tpl
=
"i am {0}, age {1}, really {0}"
.
format
(
"seven"
,
18
)
tpl
=
"i am {0}, age {1}, really {0}"
.
format
(
*
[
"seven"
,
18
])
tpl
=
"i am {name}, age {age}, really {name}"
.
format
(name
=
"seven"
, age
=
18
)
tpl
=
"i am {name}, age {age}, really {name}"
.
format
(
*
*
{
"name"
:
"seven"
,
"age"
:
18
})
tpl
=
"i am {0[0]}, age {0[1]}, really {0[2]}"
.
format
([
1
,
2
,
3
], [
11
,
22
,
33
])
tpl
=
"i am {:s}, age {:d}, money {:f}"
.
format
(
"seven"
,
18
,
88888.1
)
tpl
=
"i am {:s}, age {:d}"
.
format
(
*
[
"seven"
,
18
])
tpl
=
"i am {name:s}, age {age:d}"
.
format
(name
=
"seven"
, age
=
18
)
tpl
=
"i am {name:s}, age {age:d}"
.
format
(
*
*
{
"name"
:
"seven"
,
"age"
:
18
})
tpl
=
"numbers: {:b},{:o},{:d},{:x},{:X}, {:%}"
.
format
(
15
,
15
,
15
,
15
,
15
,
15.87623
,
2
)
tpl
=
"numbers: {:b},{:o},{:d},{:x},{:X}, {:%}"
.
format
(
15
,
15
,
15
,
15
,
15
,
15.87623
,
2
)
tpl
=
"numbers: {0:b},{0:o},{0:d},{0:x},{0:X}, {0:%}"
.
format
(
15
)
tpl
=
"numbers: {num:b},{num:o},{num:d},{num:x},{num:X}, {num:%}"
.
format
(num
=
15
)
更多格式化操作:https://docs.python.org/3/library/string.html
4.生成器和迭代器
迭代器
迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件
特点:
生成一个迭代器:
>>> a = iter([1,2,3,4,5])
>>> a
<list_iterator object at 0x101402630>
>>> a.__next__()
>>> a.__next__()
>>> a.__next__()
>>> a.__next__()
>>> a.__next__()
>>> a.__next__()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
生成器generator
定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器
代码:
def
cash_out(amount):
while
amount >
0
:
amount
-
=
1
yield
1
<br>
print
(
"擦,又来取钱了。。。败家子!"
)
ATM
=
cash_out(
5
)
print
(
"取到钱 %s 万"
%
ATM.__next__())
print
(
"花掉花掉!"
)
print
(
"取到钱 %s 万"
%
ATM.__next__())
print
(
"取到钱 %s 万"
%
ATM.__next__())
print
(
"花掉花掉!"
)
print
(
"取到钱 %s 万"
%
ATM.__next__())
print
(
"取到钱 %s 万"
%
ATM.__next__())
print
(
"取到钱 %s 万"
%
ATM.__next__())
#到这时钱就取没了,再取就报错了
print
(
"取到钱 %s 万"
%
ATM.__next__())
作用:
这个yield的主要效果呢,就是可以使函数中断,并保存中断状态,中断后,代码可以继续往下执行,过一段时间还可以再重新调用这个函数,从上次yield的下一句开始执行。
另外,还可通过yield实现在单线程的情况下实现并发运算的效果
import
time
def
consumer(name):
print
(
"%s 准备吃包子啦!"
%
name)
while
True
:
baozi
=
yield
print
(
"包子[%s]来了,被[%s]吃了!"
%
(baozi,name))
def
producer(name):
c
=
consumer(
‘A‘
)
c2
=
consumer(
‘B‘
)
c.__next__()
c2.__next__()
print
(
"老子开始准备做包子啦!"
)
for
i
in
range
(
10
):
time.sleep(
1
)
print
(
"做了2个包子!"
)
c.send(i)
c2.send(i)
producer(
"alex"
)
5.递归
特点
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
6.序列化
Python中用于序列化的两个模块
Json模块提供了四个功能:dumps、dump、loads、load
pickle模块提供了四个功能:dumps、dump、loads、load
python-学习笔记之-Day5 双层装饰器 字符串格式化 python模块 递归 生成器 迭代器 序列化
标签:
原文地址:http://www.cnblogs.com/zhanmeiliang/p/5568458.html