双层装饰器

一个函数可以被多个装饰器装饰;

多层装饰器的本质是:嵌套;

执行规则是:解释自下而上,执行自上而下

•简单的用户权限验证程序:

USE_INFO = {}  # 初始化一个字典,用户存放用户细信息
def check_login(func): # 最外层装饰器
def inner(*args, **kwargs):
if USE_INFO.get('is_login', None):
ret = func(*args, **kwargs)
return ret
else:
print('请先登入') # 如果用户未登入则提示登入
return inner
def check_admin(func): # 第二层装饰器
def inner(*args, **kwargs):
if USE_INFO.get('user_type', None) == 2: # 用户权限是2则放行
ret = func(*args, **kwargs)
return ret
else:
print('无权限') # 如果用户无权限则提示
return inner
@check_login # 最外层装饰器
@check_admin # 第二层装饰器
def index(): # 最里层函数
print('index') # 验证用户和权限通过后输出

# 执行
while True:
user_info = input('1、登入,2、查看信息、3、管理用户\n>>>')
if user_info == '1':
user_name = input('name>>:')
USE_INFO['is_login'] = user_name # 允许任何用户登入
if user_name == 'alex': # 如果用户名为'alex'则给与权限
USE_INFO['user_type'] = 2
index()
if user_info == '2':
index()
if user_info == '3':
index()

字符串的格式化

•%的常用方法

s = 'Im %s' % 'alex'
Im alex # 输出
s = 'Im %s,age%d' % ('alex', 32)
Im alex,age32 # 输出
s = 'Im %(name)s,age %(age)d' % {'name': 'alex', 'age': 31}
Im alex,age 31 # 输出
s = 'alex age %.2f' % 32.33333 # 小数点后两位,最后一位四舍五入
alex age 32.33 # 输出
s = 'age %(age).2f' % {'age': 123.245}
age 123.25 # 输出
s = 'age %(age).2f %%' % {'age': 123.432432} # 输出%
age 123.43 % # 输出

%

•format

s = '我是{},今年{}'.format('alex', 32)
我是alex,今年32 # 输出
s = '我是{},今年{}'.format(*['alex', 32])
我是alex,今年32 # 输出
s = '我是{0},今年{1},我是{0}'.format('alex', 32)
我是alex,今年32,我是alex # 输出
s = '我是{0},今年{1},我是{0}'.format(*['alex', 32])
我是alex,今年32,我是alex # 输出
s = '我是{name},今年{age}'.format(name='alex',age=32)
我是alex,今年32 # 输出
s = '我是{name},今年{age}'.format(**{'age': 32, 'name': 'alex'})
我是alex,今年32 # 输出
s = '我是{0[0]},今年{0[1]},我是{0[0]}'.format(['alex', 32])
我是alex,今年32,我是alex # 输出
s = '我是{:s},今年{:d},马内{:f}'.format('alex', 32, 100.1)
我是alex,今年32,马内100.100000 # 输出
s = '我是{:s},年龄{:d}'.format(*['alex', 32])
我是alex,年龄32 # 输出
s = '我是{name:s},今年{age:d}'.format(name='alex', age=32)
我是alex,今年32 # 输出
s = '我是{name:s},今年{age:d}'.format(**{'name': 'alex', 'age': 32})
我是alex,今年32 # 输出
s = 'numbers:{:b},{:o},{:d},{:x},{:X},{:%}'.format(15, 15, 15, 15, 15, 15.555)
numbers:1111,17,15,f,F,1555.500000% # 输出
s = 'numbers:{0:b},{0:o},{0:d},{0:x},{0:X},{0:%}'.format(15)
numbers:1111,17,15,f,F,1500.000000% # 输出
s = 'numbers:{num:b},{num:o},{num:d},{num:x},{num:X},{num:%}'.format(num=15)
numbers:1111,17,15,f,F,1500.000000% # 输出

format

生成器、迭代器、递归

•不会保存在内存中,而是返回一个对象,这个对象具有生成这些数的能力。当你去循环它的时候就会生成,这个东西叫做生成器

li = [1, 2, 3, 4, 5]
s = filter(lambda a: a > 3, li)
print(s)
<filter object at 0x0000007A4C2DC668> # 输出,这个东西叫做生成器

•生成器:使用普通函数创造,在函数体中写入yield

def func():  # 定义一个生成器
yield 1
yield 2
yield 3
res = func()
for i in res:
print(i) # 输出
1
2
3
def func():  # 定义一个生成器
yield 1
yield 2
yield 3
res = func()
print(res.__next__()) # 取第一个值 输出并保存yield的位置,下次继续从这个位置开始取值
print(res.__next__()) # 取第二个值 输出
print(res.__next__()) # 取第三个值 输出
1
2
3

yiled与__next__

def func(num):  # 定义一个生成器
start = 0
while True:
if start == num:
return # 退出
yield start
start += 1
res = func(3)
print(res.__next__()) # 取值
print(res.__next__())
print(res.__next__())
0
1
2

写个简单的range功能

•迭代器:给可以迭代的对象一个个取值,不断的调用__next__方法,直到达到某个条件就返回;我们利用迭代器去生成器里面取值,用__next__方法

def func(num):  # 定义一个生成器
start = 1
res = 1
while True:
if start <= num:
res = res * start # 循环相乘
else:
return res
start += 1
res = func(5) # 定义从1乘到几
print(res) # 输出结果

简单连乘

•递归:本质就是一个函数不断调用另一个函数,也可以调用本身

def fun(n):
n += 1
if n >= 5:
return 'end'
return fun(n)
res = fun(2)
print(res)
end # 输出 

模块:

1、模块的简介

•模块可以是 文件夹 或者 .py文件,自定义模块名称决不能和内置模块重名!

•模块的分类:内置模块,自定义模块,第三方模块

•使用模块的原因是:将代码归类

•单模块的导入:import xxx,导入的依据是sys.path

•嵌套在文件夹下:from xxx import xxx; from xxx import xxx as ooo;from xxx import *意思是去这个模块中全部导入

•导入模块的搜索路径,搜索顺序从上往下找

import sys
for i in sys.path: # python的搜索路径
print(i) # 打印结果
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\python35.zip # 第一个目录是当前脚本所在的目录
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\DLLs
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib
C:\Users\Administrator\AppData\Local\Programs\Python\Python35
C:\Users\Administrator\AppData\Local\Programs\Python\Python35\lib\site-packages # 第三方模块的安装位置

2、requests模块

requests模块是专门做http请求的

•requests模块的安装

python -m pip install requests
# 天气的请求
import requests
import json
response = requests.get('http://wthrcdn.etouch.cn/weather_mini?city=淄博') # 请求页面
response.encoding = 'utf-8' # 页面utf-8转换
dic = json.loads(response.text) # 序列化输出字符串
print(dic) # 输出

3、序列化和反序列化模块【json】和【pickle】

•json只能处理基本的数据类型,适合跨语言之间的交流;跨语言之间使用的一个规则:内部字符串必须使用双引号

import json
s = '{"k1": 1}' # 单引号里面必须是双引号,单引号叫字符,双引号叫字符串,跨语言之间使用一个规则:内部字符串必须使用双引号
res = json.loads(s) # 将字符串转换为python的字典
print(res)
{'k1': 1} # 输出
import json
re = json.load(open('file', 'r', encoding='utf-8'))
print(re, type(re)) # 输出
# load会顺便将字符串写入文件,比loads多出一步对文件的操作

4、time与datetime模块

import time
print(time.time()) # 从1970年linux出现开始到现在的秒数(时间戳)
print(time.ctime()) # 返回当前系统时间的字符串格式
print(time.ctime(time.time() - 86400)) # 减去一天的时间,转换为字符串
print(time.gmtime(time.time()-86400)) # 减去一天的时间,将时间戳转换为struct_time格式
print(time.localtime(time.time())) # 将本地系统的时间戳转换为struct_time格式
print(time.mktime(time.localtime())) # 将本地的时间struc_time转换为时间戳格式
print(time.strftime('%Y-%m-%d %H-%M-%S', time.localtime())) # 将本地的时间struc_time转换为指定字符串
print(time.strptime("2016-01-28", "%Y-%m-%d")) # 将字符串装换为struct_time格式
import datetime, time
print(datetime.date.today()) # 输出今天的日期,格式为xx-xx-xx
print(datetime.date.fromtimestamp(time.time())) # 将时间戳转化为xx-xx-xx
print(datetime.datetime.now()) # 输出今天的日期、时间和时间戳,格式xx-xx-xx xx:xx:xx.xxxxxx
print(datetime.datetime.now().timetuple()) # 返回struct_time格式
print(datetime.datetime.now().replace(2011, 1, 1)) # 替换指定值
print(datetime.datetime.strptime('21//11//06 16:30', '%d//%m//%y %H:%M')) # 将字符串装换为日期格式,间隔符随意
print(datetime.datetime.now() + datetime.timedelta(days=10)) # 比现在加10天
print(datetime.datetime.now() + datetime.timedelta(days=-10)) # 比现在减10天
print(datetime.datetime.now() + datetime.timedelta(hours=10)) # 比现在加10小时
print(datetime.datetime.now() + datetime.timedelta(seconds=120)) #比现在时间加120s

 5、os模块

给系统或者程序提供需要的路径

import os
print(os.path.abxpath(__file__)) # 获取自己的绝对路径
C:\Users\Administrator\PycharmProjects\s13\day5\day5_homework\conf\setting.py
print(os.path.split(__file__)) # 分割成目录和文件,输出为tuple
('C:/Users/Administrator/PycharmProjects/s13/day5/day5_homework/conf', 'setting.py')
print(os.path.dirname(__file__)) #获取分割后的目录,也就是split元组的第一个元素
C:/Users/Administrator/PycharmProjects/s13/day5/day5_homework/conf
print(os.path.basepath(__file__)) # 获取文件名
setting.py
print(os.getcwd()) # 获取当前的工作目录
C:\Users\Administrator\PycharmProjects\s13\day5\day5_homework\conf
print(os.curdir) # 返回当前目录('.')
.

6、logging模块

•简单logging

import logging
logging.warning('user [alex] attempted wrong 3 times')
logging.critical('servcer is down ')
WARNING:root:user [alex] attempted wrong 3 times # 输出,默认是以管理员root执行的
CRITICAL:root:servcer is down

•往文件里面写入logging

import logging
logging.basicConfig(filename='file',level=logging.INFO) # 只有比INFO级别高的级别才会写入file文件
logging.warning('user [alex] attempted wrong 3 times')
logging.critical('servcer is down ')
logging.debug('hahahahahha我是debug') WARNING:root:user [alex] attempted wrong 3 times # 文件内容
CRITICAL:root:servcer is down

•加入时间的logging

import logging
logging.basicConfig(filename='file', level=logging.INFO,format='%(asctime)s %(message)s',datefmt='%m/%d/%Y %I:%M:%S %p') # 只有比INFO级别高的级别才会写入file文件,加上时间
logging.warning('user [alex] attempted wrong 3 times')
logging.critical('servcer is down ')
logging.debug('hahahahahha我是debug') 06/10/2016 11:14:41 PM user [alex] attempted wrong 3 times # 文件内容
06/10/2016 11:14:41 PM servcer is down

•将logging打印屏幕和文件

7、re模块

python中的正则表达式,是对字符串进行操作

import re
匹配规则,数据源
re.match(pattern,data source)
m = re.match('ab', 'abdasd')
print(m)
# 输出
<_sre.SRE_Match object; span=(0, 2), match='ab'> 返回正则自己的对象,代表匹配成功,匹配不上返回值为None
print(m.group()) # 打印出匹配的东西,NoneType没有group
# 输出
ab s = re.match('[0-9]{10}', '3453523432dnau') # match方法从开头进行匹配,{}里面加固定次数或者范围
print(s.group())
# 输出
3453523432 s = re.findall('[0-9]{1,11}', 'ni2e82138742') # findall没有group方法,直接输出
print(s)
# 输出
['2', '82138742'] # 返回列表
s = re.findall('[a-zA-Z]', 'fheuf347982635dwekhur')
print(s)
# 输出
['f', 'h', 'e', 'u', 'f', 'd', 'w', 'e', 'k', 'h', 'u', 'r'] s = re.findall('[a-zA-Z]+', 'djauifg37184&@6 rn———— rf3287658') #匹配任意字符,返回的是一个列表
print(s)
# 输出
['djauifg', 'rn', 'rf'] s = re.search('(\d+){1,3}', '1367dhi1423euq') # 找到匹配的第一个就返回
print(s.group())
# 输出
1367
s = re.sub('\d', '|', 'diuq314', count=2) # 替换,可以指定替换的数量
print(s)
# 输出
diuq||4

re

												

Python之【模块】的更多相关文章

  1. Python标准模块--threading

    1 模块简介 threading模块在Python1.5.2中首次引入,是低级thread模块的一个增强版.threading模块让线程使用起来更加容易,允许程序同一时间运行多个操作. 不过请注意,P ...

  2. Python的模块引用和查找路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...

  3. Python Logging模块的简单使用

    前言 日志是非常重要的,最近有接触到这个,所以系统的看一下Python这个模块的用法.本文即为Logging模块的用法简介,主要参考文章为Python官方文档,链接见参考列表. 另外,Python的H ...

  4. Python标准模块--logging

    1 logging模块简介 logging模块是Python内置的标准模块,主要用于输出运行日志,可以设置输出日志的等级.日志保存路径.日志文件回滚等:相比print,具备如下优点: 可以通过设置不同 ...

  5. python基础-模块

    一.模块介绍                                                                                              ...

  6. python 安装模块

    python安装模块的方法很多,在此仅介绍一种,不需要安装其他附带的pip等,python安装完之后,配置环境变量,我由于中英文分号原因,环境变量始终没能配置成功汗. 1:下载模块的压缩文件解压到任意 ...

  7. python Queue模块

    先看一个很简单的例子 #coding:utf8 import Queue #queue是队列的意思 q=Queue.Queue(maxsize=10) #创建一个queue对象 for i in ra ...

  8. python logging模块可能会令人困惑的地方

    python logging模块主要是python提供的通用日志系统,使用的方法其实挺简单的,这块就不多介绍.下面主要会讲到在使用python logging模块的时候,涉及到多个python文件的调 ...

  9. Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...

  10. Python Paramiko模块与MySQL数据库操作

    Paramiko模块批量管理:通过调用ssh协议进行远程机器的批量命令执行. 要使用paramiko模块那就必须先安装这个第三方模块,仅需要在本地上安装相应的软件(python以及PyCrypto), ...

随机推荐

  1. C#4语法新特性

    C#4,.NET Framework 4.0, Visual Studio 2010  C#4.0新引进的语法基于.Net Framework 4.0.主要引进的语法:动态类型,命名参数.可选参数,优 ...

  2. 一个 Task 不够,又来一个 ValueTask ,真的学懵了!

    一:背景 1. 讲故事 前几天在项目中用 MemoryStream 的时候意外发现 ReadAsync 方法多了一个返回 ValueTask 的重载,真是日了狗了,一个 Task 已经够学了,又来一个 ...

  3. 12装饰器及*args,**kwargs

    注:参数和返回值都是一个函数. 1,无参数 def decotare1(func): def wrapper(): print("First") func() return wra ...

  4. Oracle guide_Spring2.5_CN_reference_pdf

    http://www.oracle.com/pls/db112/homepage spring_CN.rar (3.1 MB) 下载次数: 2

  5. 【JVM】肝了一周,吐血整理出这份超硬核的JVM笔记(升级版)!!

    写在前面 最近,一直有小伙伴让我整理下关于JVM的知识,经过十几天的收集与整理,初版算是整理出来了.希望对大家有所帮助. JDK 是什么? JDK 是用于支持 Java 程序开发的最小环境. Java ...

  6. python3中的os.path模块

    os.path模块主要用于获取文件的属性,这里对该模块中一些常用的函数做些记录. os.abspath(path):获取文件的绝对路径.这里path指的是路径,例如我这里输入"data.cs ...

  7. (3)ElasticSearch在linux环境中安装与配置head插件

    1.简介 ElasticSearch-Head跟Kibana一样也是一个针对ElasticSearch集群操作的API的可视化管理工具,它提供了集群管理.数据可视化.增删改查.查询语句等功能,最重要还 ...

  8. 处理Ceph osd的journal的uuid问题

    前言 之前有一篇文章介绍的是,在centos7的jewel下面如果自己做的分区如何处理自动挂载的问题,当时的环境对journal的地方采取的是文件的形式处理的,这样就没有了重启后journal的磁盘偏 ...

  9. rbd的数据在哪里

    创建一个rbd [root@mytest ~]# rbd create test1 --size 4000 查看rbd信息 [root@mytest ~]# rbd info test1 rbd im ...

  10. RedisUtils工具类

    package test.util; import org.springframework.beans.factory.annotation.Autowired; import org.springf ...