Day4 内置函数补充、装饰器
li = [11,22,33,44]
def f1(arg):
arg.append(55)
#函数默认返回值None,函数参数传递的是引用
li = f1(li)print(li)
内置函数补充:
判断是否被调用
def f1():
pass
print(callable(f1))
ASCII码与数字转换
#数字转换为ASCII码
r = chr(65)
print(r)
#ASCII转换为数字
n = ord('a')
print(n)
随机验证码
import random
list_temp =[]
for i in range(10):
r = random.randrange(0,10)
if r == 2 or r == 4 or r == 9:
num = random.randrange(0, 10)
list_temp.append(str(num))
else:
temp = random.randrange(65, 91)
c = chr(temp)
list_temp.append(c)
result = "".join(list_temp)
print(result)
编译、执行
s = "print(123)"
#编译: single(单行), eval(表达式), exec(编译成和python一样)
#将字符串编译成python代码
r = compile(s, "<string>", "exec")
#exec执行python代码,没有返回值
exec(r)
#eval只执行表达式,有返回结果
box = "8 * 8"
ret = eval(box)
print(ret)
查看对象提供的功能和帮助
#dir()查看一个对象提供的功能
dir(dict)
#查看功能的具体使用,即源码
help(list)
计算商和余数
#共97条数据,每页显示10条,需要多少页?
n1, n2 = divmod(97,10)
#n1为商,n2位=为余数
print(n1, n2)
判断对象是否是类的实例
#对象:由类创建,对象是类的实例
a = "wang"
#判断对象是否是类的实例
r = isinstance(a, str)
print(r)
筛选符合条件的函数
list_filter = [21,22,33,44,5,66,777,88,9,0,89]
def f2(a):
if a > 22:
return True
#filter(函数,可迭代的对象),filter内部首先会循环第二个参数,将每一个循环元素取去执行第一个参数(即函数)ret = filter(f2, list_filer)print(list_filer)
filter内部操作
for item in 第二个参数:r = 第一个参数(item)if r:result(item)return result
将简单函数使用lambda表示
f1 = lambda a: a > 30
ret = f1(31)
print(ret) li = [11,22,33,44,55,66]
result = filter(lambda a: a > 33, li)
print(list(result))1
map()将返回值添加到结果中
#map(函数,可迭代的对象(可以for循环的内容))
# 将返回值添加到结果中
li = [11,22,33,44,55,66]
result = map(lambda a: a + 100, li)
print(list(result))
filter:如果函数返回True,将元素添加到结果中map:将函数返回值添加到结果中
globals()所有的全局变量
locals()所有的局部变量
NAME = 'wang' def show():
a = 123
print(locals())
print(globals())
show()
hash()用于字典的key保存
s = 'pssiacmaakmcasmcamcasomcwmclwmclw'
print(hash(s))
id()查看内存地址
iter()创建迭代器
len()查看长度
s = "哈哈"
b = bytes(s, encoding='utf-8')
#python3.*即可通过字符查看,也可以通过字节查看
#python2.7只能通过字节查看
print(len(b))
ss = "哈哈"
for a in ss:
print(a)
最大值、最小值、求和
#max(),min(),sum()
rr = max([11,22,33,44])
print(rr)
aa = min([11,22,33,44])
print(aa)
dd = sum([11,22,33,44])
print(dd)
object是所有类的父类
求指数
r6 = pow(2, 10)
print(r6)
四舍五入
r = round(4.6)
print(r)
进制转换
十进制转二进制bin()、十进制转十六进制hex()、十进制转八进制oct()、十进制转十进制int()
slice()切片、sort()排序、vars()查看变量
zip()混合列表中对应下标的元素组成元祖,元祖为新的列表中的元素
l1 = ['alex', 11, 22 ,33]
l2 = ['is', 11, 22, 33]
l3 = ['sb', 11, 22, 33] r = zip(l1, l2, l3)
temp = list(r)[0]
ret = ' '.join(temp)
print(ret)
反转
li = [11, 22, 33, 44, 'll']
li.reverse()或reverse(li)
将字符串转换为列表
s = "[11, 22, 33, 44]"
s = '{"k1":"v1"}'
print(type(s), s)
import json
n = json.loads(s) #将一个字符串转换成python的基本数据类型,注意:字符串形式的字典'{"k1":"v1"}'内部的字符串必须为双引号
print(type(n), n)
json
import jsondef json_conf(record):
dict_conf = json.loads(record)
backend = dict_conf['backend'] record_conf = "server %s %s weight %d maxconn %d" % (dict_conf['record']['server1'],
dict_conf['record']['server2'],
dict_conf['record']['weight'],
dict_conf['record']['maxconn']) print("处理完成后,backend is : %s ,record is : %s" % (backend, record_conf))
ha.conf文件信息
global
log 127.0.0.1 local2
daemon
maxconn 256
log 127.0.0.1 local2 info
defaults
log global
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option dontlognull listen stats :8888
stats enable
stats uri /admin
stats auth admin:1234 frontend oldboy.org
bind 0.0.0.0:80
option httplog
option httpclose
option forwardfor
log global
acl www hdr_reg(host) -i www.oldboy.org
use_backend www.oldboy.org if www backend www.oldboy.org
server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000
server 100.1.7.29 100.1.7.39 weight 10 maxconn 300 backend buy.oldboy.org
server 100.1.7.90 100.1.7.90 weight 20 maxconn 3000
读取ha.conf配置文件,将与用户输入对应的行添加到列表中
def fetch(backend):
#print("backend is : %s" % backend)
#backend = “www.oldboy.org”
result = []
#打开配置文件
with open('ha.conf', 'r', encoding='utf-8') as f:
#设定跳出判断标记位
flag = False
#按行读取文件
for line in f:
#print("line is : %s" % line)
#匹配到backend行
if line.strip().startswith("backend") and line.strip() == "backend " + backend:
#print("line is : %s" % line)
flag = True
#匹配到backend后跳过这一行
continue
#flag = True时,配置文件中有两种情况:backend buy.oldboy.org和backend www.oldboy.org
#读完backend这一行后继续后面读又出现了backend,即读到这一句:backend buy.oldboy.org
if flag and line.strip().startswith("backend"):
flag = False
#终止
break
#匹配到backend且是一次匹配到backend,flag = True,backend www.oldboy.org,且去掉空字符串
if flag and line.strip():
#将"server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000"添加到结果列表中
result.append(line.strip()) return resultret = fetch("www.oldboy.org")
print(ret)
更新配置文件
def add(backend, record):
#先检查记录是否存在fetch()
record_list = fetch(backend)
#代码顺序,先易后难
if not record_list:
#backend不存在,需要新增backend和record,即把原文件全部写到新的文件中,然后在最后添加backend+record_list
with open('ha.conf', 'r') as old, open('new.conf', 'w') as new:
#读取一行旧的文件,写一行新的文件
for line in old:
new.write(line)
#将新增的部分添加到新文件末尾
#先加backend
new.write("\nbackend " + backend + "\n")
#后加server信息
new.write(" " * 8 + record + "\n")
else:
#backend存在
if record in record_list:
#backend存在,record也存在
import shutil
#复制原文件
shutil.copy("ha.conf", "new.conf")
else:
#backend存在,record不存在
#不存在record则将其添加到内存列表中
record_list.append(record)
#将旧的文件读一行,在新的文件中写一行
with open('ha.conf', 'r') as old, open('new.conf', 'w') as new:
#如果读到backend,判断是否需要写到新的文件中
flag = False
for line in old:
#匹配到backend和输入的内容www.oldboy.org
if line.strip().startswith("backend") and line.strip() == "backend " + backend:
#backend下面的内容不应写到文件中,标记True
flag = True
#接着将backend www.oldboy.org写到新文件中
new.write(line)
#回到内存中将record存放到record_list中的记录写到新的文件中,即"server 100.1.7.9 100.1.7.9 weight 20 maxconn 3000"写到new中
for new_line in record_list:
new.write(" " * 8 + new_line + "\n")
#找到第二个backend,则读一行写一行
if flag and line.strip().startswith("backend"):
#判断需要将backend下面的内容写到文件中,标记False
flag = False
#将当前行写入新的文件中,即backend buy.oldboy.org写到新的文件中
new.write(line)
#加continue,防止下面读一行写一行时重复写backend buy.oldboy.org
continue
#若backend下面的行有数据,则读一行写一行
if not flag and line.strip():
new.write(line) bk = "www.oldboy.org"
rd = "server 100.1.7.59 100.1.7.59 weight 60 maxconn 8000"
add(bk, rd)
最终详尽版(包括查看、增加和删除)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: WangHuafeng import json def check_conf(check_info):
flag = False
check_list = []
with open('ha.conf') as f:
for line in f:
if line.startswith('backend'):
if check_info == line.strip().split()[1]:
flag = True
continue
if flag and line.strip().startswith('backend'):
break
if flag and line.strip():
check_list.append(line.strip())
return check_list def add_conf(backend, record_conf):
print("传入add函数后的值,backend is %s, record is : %s" % (backend, record_conf))
#调用check_conf函数将查询到的server信息添加到列表中
add_list = check_conf(backend)
print("查询原文件中记录存入列表:%s" % add_list)
#如果记录不存在,则将原文件内容写入新文件中,并在新文件末尾添加记录
if not add_list:
with open('ha.conf') as old, open('new_ha.conf', 'w') as new:
for line in old:
new.write(line)
#在末尾直接添加记录,注意换行
new.write("\nbackend " + backend + "\n")
new.write(" "*8 + record_conf)
else:
#如果添加的记录存在
if record_conf in add_list:
print("记录已存在。")
#原文件中有backend+server记录,但输入的记录需要更新到该记录下
else:
#将旧文件写入新文件标志位
flag = False
#写入add_list中存放的记录标志位
write_flag = False
#先输入的server记录存入列表中
add_list.append(record_conf)
#一边读旧文件一边写新的文件
with open("ha.conf") as old, open("new_ha.conf", 'w') as new:
for line in old:
#print("逐行打印文件:%s" % line)
#查找backend行
if line.startswith('backend'):
#print("打印backend开头的信息:%s" % line)
#遇到匹配的记录后,需要将backend所在行的记录写入新文件
if backend == line.strip().split()[1]:
new.write(line)
#打开写文件标志
flag = True
continue
#若再次匹配到backend说明到了下一个以backend开头的行,则反转写文件标志位
if line.startswith("backend"):
flag = False
#将两行backend之间的文件写入新文件中
if flag:
if not write_flag:
#循环add_list列表将记录写入新文件
for line_record in add_list:
new.write(" "*8 + line_record + "\n")
write_flag = True
else:
new.write(line) def delete_conf(backend, record_conf):
# print("backend : %s" % backend)
# print("record : %s" % record_conf)
# 调用check_conf函数将查询到的server信息添加到列表中
del_list = check_conf(backend)
# print(check_list)
# 如果记录不存在,则将原文件内容写入新文件中,并在新文件末尾添加记录
if not del_list:
print("您输入的字段不存在。")
else:
# 如果添加的记录存在
if record_conf in del_list:
del_list.remove(record_conf)
# 将旧文件写入新文件标志位
flag = False
# 写入check_list中存放的记录标志位
write_flag = False
# 一边读旧文件一边写新的文件
with open("ha.conf") as old, open("new_ha.conf", 'w') as new:
for line in old:
# 查找backend行
if line.startswith('backend'):
# 遇到匹配的记录后,需要将backend所在行的记录写入新文件
if backend == line.strip().split()[1]:
new.write(line)
# 打开写文件标志
flag = True
continue
# 若再次匹配到backend说明到了下一个以backend开头的行,则反转写文件标志位
if line.startswith("backend"):
flag = False
# 将两行backend之间的文件写入新文件中
if flag:
if not write_flag:
# 循环check_list列表将记录写入新文件
for line_record in del_list:
new.write(" " * 8 + line_record + "\n")
write_flag = True
else:
new.write(line)
else:
print("您输入的记录不存在。") def menu():
print(
"""
**********操作编号***********
1 查看
2 增加
3 删除
*****************************
"""
) def json_conf(record,input_conf):
print("json is : %s %s" % (record, input_conf))
dict_conf = json.loads(record)
backend = dict_conf['backend'] record_conf = "server %s %s weight %d maxconn %d" % (dict_conf['record']['server1'],
dict_conf['record']['server2'],
dict_conf['record']['weight'],
dict_conf['record']['maxconn']) print("处理完成后,backend is : %s ,record is : %s" % (backend, record_conf))
if input_conf == '2':
add_conf(backend, record_conf)
if input_conf == '3':
delete_conf(backend, record_conf) def main():
menu()
flag = False
while not flag:
input_conf = input("请输入操作编号:")
if input_conf == '1':
check_info = input("请按照以下格式输入:(www.oldboy.org) ")
if check_conf(check_info):
flag = True
for k,v in enumerate(check_conf(check_info),1):
print(k,':',v)
else:
print("您输入的字段不存在。")
flag = False
elif input_conf == '2':
add_info = input('''请按照以下格式添加数据:
{"backend":"www.oldboy.org","record":{"server1":"100.1.27.9","server2":"100.1.37.19","weight":20, "maxconn":3000}}
''')
json_conf(add_info, input_conf)
flag = True
elif input_conf == '3':
del_info = input('''请按照以下格式添加数据:
{"backend":"www.oldboy.org","record":{"server1":"100.1.7.9","server2":"100.1.7.19","weight":20, "maxconn":3000}}
''')
json_conf(del_info, input_conf)
flag = True
else:
print("你输入的操作编号不存在,请重新输入")
flag = False if __name__ == '__main__':
main()
装饰器
s1.py
#在函数的外部进行装饰,在不改变调用函数的基础上,可以在执行函数前或执行函数后添加一个功能
def outer(func):
def inner():
print('log')
return func()
return inner @outer
def f1():
print("F1") @outer
def f2():
print("F2") @outer
def f100():
print("F100")
s2.py
import s1
s1.f1()
s1.f2()s100.f2()
函数整体可以当参数传递
def f1():
print('123') #xxx代指函数f1()整体,函数整体可以当作参数传递
def f2(xxx):
xxx() f2(f1)
装饰器功能
def outer(func):
def inner():
print('log')
ret = func()
print("after")
return ret
return inner # @ + 函数名
# 功能:
# 1、自动执行outer函数并且将其下面的函数名f1当作参数传递
# 2、将outer函数的返回值重新赋值给f1
@outer
def f1():
print("F1")
分析步骤:
def outer(func):
print(123, func) # @ + 函数名
# 功能:
# 1、自动执行outer函数并且将其下面的函数名f1当作参数传递
# 2、将outer函数的返回值重新赋值给f1
@outer
def f1():
print("F1") #执行过程:1.执行outer(),并将函数f1当作参数传递给outer,即outer(f1)
# 2.打印123,并将返回值123赋值给f1,即f1 = 123,所以打印f1时,显示123
s2.py
def outer(func):
#inner函数替代f1函数
def inner():
print("before")
return inner @outer
def f1():
print("F1")
s1.py
import s2 s2.f1()
s2.py
def outer(func):
#f1变成func
#inner函数替代f1函数
def inner():
print("before")
func()
print("after")
return inner @outer
def f1():
print("F1")
s1.py
import s2 s2.f1()
详解装饰器执行过程
装饰器返回值
s2.py
def outer(func):
def inner():
print("before")#如果原函数有返回值需要在装饰器函数中添加返回
r = func()
print("after")#将原函数中的返回值返回
return r
return inner @outer
def f1():
print("F1")
return "haha" @outer
def f2():
print("F2")
s1.py
import s2 # f1被装饰器装饰后返回值为None,如果原函数有返回值需要在装饰器函数中添加返回
ret = s2.f1()
print(ret)
s2.f2()
传递参数
一个参数:
def outer(func):
def inner():
print("before")
#如果原函数有返回值需要在装饰器函数中添加返回
r = func()
print("after")
#将原函数中的返回值返回
return r
return inner @outer
def f1():
print("f1")
return "haha"
import s2 # f1被装饰器装饰后返回值为None,如果原函数有返回值需要在装饰器函数中添加返回
ret = s2.f1("fish")
print(ret)
多个参数
def outer(func):
def inner(*args, **kwargs):
print("before")
#如果原函数有返回值需要在装饰器函数中添加返回
r = func(*args, **kwargs)
print("after")
#将原函数中的返回值返回
return r
return inner @outer
def f1(arg):
print(arg)
return "haha" @outer
def f2(arg1, arg2):
print("F2")
import s2 # f1被装饰器装饰后返回值为None,如果原函数有返回值需要在装饰器函数中添加返回
ret = s2.f1("fish")
print(ret)
s2.f2("haha", "niu")
装饰器做权限认证
LOGIN_USER = {"is login" : False}
def outer(func):
def inner(*args, **kwargs):
if LOGIN_USER['is login']:
r = func(*args, **kwargs)
return r
else:
print("请登录")
@outer
def manager():
print("欢迎%s登录" % LOGIN_USER['current_user'])
Day4 内置函数补充、装饰器的更多相关文章
- Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器)
Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器) 1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数
- python学习笔记-day4笔记 常用内置函数与装饰器
1.常用的python函数 abs 求绝对值 all 判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any ...
- python学习之路-4 内置函数和装饰器
本篇涉及内容 内置函数 装饰器 内置函数 callable() 判断对象是否可以被调用,返回一个布尔值 1 2 3 4 5 6 7 8 9 10 11 num = 10 print(callabl ...
- day 12 内置函数,装饰器,递归函数
内置函数 内置函数:python给咱们提供了一些他认为你会经常用到的函数,68种 内置函数 abs() dict() help() min() setattr() all() di ...
- python之路 内置函数,装饰器
一.内置函数 #绝对值 abs() #所有值都为真才为真 all() #只要有一个值为真就为真 any() #10进制转成二进制 bin() #10进制转成八进制 oct() #10进制转成十六进制 ...
- Python之函数目录(自定义函数,内置函数,装饰器,迭代器,生成器)
1.初始函数 2.函数嵌套及作用域 3.装饰器 4.迭代器和生成器 6.内置函数 7.递归函数 8.匿名函数 9.函数相关定义 10.三元表达式.列表推导式.生成器表达式 11.函数与方法的区别
- Python学习【第5篇】:Python之函数(自定义函数,内置函数,装饰器,迭代器,生成器、模块)
一.为什么要使用函数? 1.避免代码重用 2.提高代码的可读性 二.函数的定义与调用 1. def 函数名(参数1,参数2): ''' 函数注释''' print('函数体') return 返回值 ...
- python-常用内置函数与装饰器
1.常用的python函数 abs 求绝对值 all 判断迭代器中所有的数据是否为真或者可迭代数据为空,返回真,否则返回假 any ...
- python3.x Day4 内置方法,装饰器,生成器,迭代器
内置方法,就是python3提供的各种函数,可以认为是关键字,帮助进行一些列的牛x运算. abs()#取绝对值 all([])#可迭代对象中的所有元素都为True 则为True,只要至少一个为Fals ...
随机推荐
- HDOJ(HDU) 2153 仙人球的残影(谜一样的题、、、)
Problem Description 在美丽的HDU,有一名大三的同学,他的速度是众所周知的,跑100米仅仅用了2秒47,在他跑步过程中会留下残影的哎,大家很想知道他是谁了吧,他叫仙人球,既然名字这 ...
- C++ 路径中\\与/
windows默认使用\\ linux默认使用/ 可以都用/
- wireshark的使用
1. 过滤 比如输入www.baidu.com 使用域名过滤条件为 跟踪的过程是: 105和106是dns查询,108和115是dns回应,为什么会有两条,我也不是和清楚 展开106 可以它使用的是U ...
- 【OSGi】OSGi生命周期
1 生命周期管理 对于非模块化应用,生命周期将应用作为一个整体来操作: 而对于模块化应用,则可以以细粒度的方式来管理应用的某一个独立部分. OSGi生命周期管理 OSGi生命周期层有两种不同的作用: ...
- DB2 创建数据库
0.一些准备工作可能用到的命令 db2cmd --进入db2命令行 db2 list database directory --显示已有的数据库 db2 drop db pcore --删除一个数据库 ...
- Solr系列二:Solr与mmseg4j的整合
mmseg4j是一个很好的中文分词器,solr与mmseg4j的整合也非常简单.如下: 第一步:下载mmseg4j的jar包,网上搜索一下有很多下载地址,如下是csdn上的一个连接:http://do ...
- selenium webdriver启动IE浏览器失败的解决办法
通过selenium webdriver启动IE浏览器失败,报错:selenium.common.exceptions.WebDriverException: Message: Unexpected ...
- Miller-Rabin质数测试
Miller-Rabin质数测试 本文主要讨论使用Miller-Rabin算法编写素数的判定算法,题目来源于hihocoder. 题目 题目要求 时间限制:10000ms 单点时限:1000ms 内存 ...
- jquery在ie浏览器下中文乱码的问题
用jquery的ajax方法在调用后台数据发现中文乱码,无法解析中文的url,而在别的浏览器下面就不会,如下所示 $.ajax({ type:'get', url:'薛之谦-演员.lrc', asyn ...
- 使用APICloud设计物联网APP
0.前言 1).APP功能: 1.控制室内插座的开关. 2.查看室内实时温湿度和温湿度趋势. 3.控制小车的行走,小车摄像头的开启/关闭.移动. 4.查看摄像头监控画面,可拍照并追溯. 5.查看服务器 ...
