上周复习
1,python基础
2,基本数据类型
3,函数式编程
函数式编程、三元运行、内置函数、文件处理
-
容易出问题的点
函数默认返回值为none,对于列表字典,传入引用。
1234567891011121314151617#函数没有返回值的时候返回none
li
=
[
11
,
22
,
33
,
44
]
def
f2(arg):
arg.append(li)
ret
=
f2(li)
print
(ret)
-
-
-
-
-
none
#字典,列表等传值传引用
li
=
[
11
,
22
,
33
,
44
]
def
f2(arg):
arg.append(
55
)
f2(li)
print
(li)
-
-
-
-
-
[
11
,
22
,
33
,
44
,
55
]
-
所有为False值
所有空的 s=[],dict{},0,none,""
内置函数下
1,chr和ord:完成ASCI码和字符间的转换
1
2
3
4
5
6
7
8
9
|
r = chr ( 65 )
print (r)
n = ord ( "a" )
print (n)
- - - - - - -
A 97 |
随机数小程序
1
2
3
4
5
6
7
8
9
10
11
12
|
#注意这里取得是A-Z(65-90)实际这里的应该用65-91,取头舍尾 import random
i = random.randrange( 65 , 91 )
c = chr (i)
print (c)
- - - - - -
L #ord的使用 print ( ord ( 'a' ))
- - -
97 |
六随机验证码程序
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import random
li = []
for i in range ( 6 ):
r = random.randrange( 0 , 5 )
if r = = 1 or r = = 4 :
num = random.randrange( 0 , 10 )
li.append( str (num))
else :
temp = random.randrange( 65 , 91 )
c = chr (temp)
li.append(c)
result = "".join(li)
print (result)
- - - - - -
FSVAW8 |
2,compile(),eval(),exec()
compile:将字符串编译成python代码。
eval:只能执行表达式,且有返回值。
exec:执行python代码,但是无返回值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
s = "print(123)"
# 将字符串编译成python代码 r = compile (s, "<string>" , "exec" )
print (r)
exec (s)
s = "8*8"
ret = eval (s)
print (ret)
# exec无返回值 print ( exec ( "7+9+8" ))
# 执行表达式,并且获取结果 ret = eval ( "7+9+8" )
print (ret)
- - - - -
<code object <module> at 0x0000000000CF36F0 , file "<string>" , line 1 >
123 64 None 24 |
3,dir:列出一个类给出了哪些功能(help)
1
2
3
4
|
print ( dir ( dict ))
- - - - - -
[ '__class__' , '__contains__' , '__delattr__' , '__delitem__' , '__dir__' , '__doc__' , '__eq__' , '__format__' , '__ge__' , '__getattribute__' , '__getitem__' , '__gt__' , '__hash__' , '__init__' , '__iter__' , '__le__' , '__len__' , '__lt__' , '__ne__' , '__new__' , '__reduce__' , '__reduce_ex__' , '__repr__' , '__setattr__' , '__setitem__' , '__sizeof__' , '__str__' , '__subclasshook__' , 'clear' , 'copy' , 'fromkeys' , 'get' , 'items' , 'keys' , 'pop' , 'popitem' , 'setdefault' , 'update' , 'values' ]
|
4,divmod:对一个数取余,且将结果的商和余数存入元组
eg:某网站有156条记录,要求每页显示10行,工多少页。
1
2
3
4
5
6
7
8
9
10
|
r = divmod ( 156 , 10 )
print (r)
print (r[ 0 ])
print (r[ 1 ])
# 下面简写 n1, n2 = divmod ( 156 , 10 )
- - - - - -
( 15 , 6 )
15 6 |
5,enumerat:列举,枚举
enumerate()是python的内置函数
enumerate在字典上是枚举、列举的意思
对于一个可迭代的(iterable)/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值
enumerate多用于在for循环中得到计数
例如对于一个seq,得到:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
# 上述方法有些累赘,利用enumerate()会更加直接和优美 list1 = [ "这" , "是" , "一个" , "测试" ]
for index, item in enumerate (list1):
print (index, item)
- - - - - - - - - -
0 这
1 是
2 一个
3 测试
#同样可以指定起始位置(注意起始位置) list1 = [ "这" , "是" , "一个" , "测试" ]
for index, item in enumerate (list1, 1 ):
print (index, item)
- - - - - - - - - -
1 这
2 是
3 一个
4 测试
#统计文件行数的两种方式 count1 = len ( open ( 'db' , 'r' ).readlines())
print (count1)
count = 0
for index, line in enumerate ( open ( 'db' , 'r' )):
count + = 1
print (count)
- - - - - - - - - -
5 5 |
6,isinstance:判断对象是某个类的实例(bool值)。
对象和类的关系:对象是类的实例
eg:s="alex"对象,他的类是字符串str。对象和类内部关联,在使用这个对象的时候就会调用换个对象类的方法。
1
2
3
4
5
6
7
8
9
|
s = "alex" # 对象,"alex" => str
s = [ 11 , 11 , 11 ]
# 用于判断,对象是否是某个类的实例 r = isinstance (s, list )
print (r)
- - - - - - -
TRUE |
7,filter:ret=filter(f2,li)(返回li中满足筛选条件f2的值,这里f2返回True元素才合法)
li:必须为可迭代的对象。f2:为执行条件。
filter(函数,可迭代对象)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
# 传统方式实现 def f1(args):
result = []
for item in args:
if item > 22 :
result.append(item)
return result
li = [ 11 , 22 , 33 , 44 , 55 ]
ret = f1(li)
print (ret)
- - - - - - -
[ 33 , 44 , 55 ]
#使用filter实现一 # print(filter(f2,li)) # filter内部,循环第二个参数 # result = [] # for item in 第二个参数: # r = 第一个参数(item) # if r : # result(item) # return result # filter ,循环循环第二个参数,让每个循环元素执行 函数,如果函数返回值True,表示元素合法 def f2(a):
if a> 22 :
return True
li = [ 11 , 22 , 33 , 44 , 55 ]
ret = filter (f2, li)
print ( list (ret))
- - - - -
[ 33 , 44 , 55 ]
#lambda表达式实现 f1 = lambda a: a > 30 #表达式返回bool值,通过bool值的结果来判断元素是否合法
ret = f1( 10 )
print (ret)
li = [ 11 , 22 , 33 , 44 , 55 ]
result = filter ( lambda a: a > 33 , li)
print ( list (result))
- - - - - -
False [ 44 , 55 ]
|
map:批量执行某一操作,返回值
map(函数,可迭代的对象(可以for循环的东西))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
#方式一,批量执行 li = [ 11 , 22 , 33 , 44 , 55 ]
def f2(a):
return a + 100
result = map (f2, li)
print ( list (result))
#方式二:lambda表达式 result = map ( lambda a: a + 200 , li)
print ( list (result))
- - - - - -
[ 111 , 122 , 133 , 144 , 155 ]
[ 211 , 222 , 233 , 244 , 255 ]
# filter # 函数返回True,将元素添加到结果中 # map # 将函数返回值添加到结果中 |
8,globals():所有的全局变量
locals():所有的局部变量
hash():生成哈希表,更虎字典key的保存
hex():将十进制转换16进制
9,len() 查看字符串有多少个字节或者字符
python2:只能按照字节看
python3:按照字节和字符都能看
10,callable:判断函数值能不能被执行,返回bool值
1
2
3
4
5
6
7
8
9
10
11
12
|
def f1():
pass
# f1() f2 = 123
# f2() print ( callable (f1))
print ( callable (f2))
- - - - -
True False |
11.max,min,sum 求最大值、最小值和求和
1
2
3
4
5
6
7
8
|
li = [ 11 , 22 , 33 , 44 , 55 ]
print ( max (li))
print ( min (li))
print ( sum (li))
- - - - - -
55 11 165 |
12.bin,oct,int,min 分别可以做二进制、八进制、十进制、十六进制的转换。
1
2
3
4
5
6
7
8
9
10
|
a = 100
print ( bin (a))
print ( oct (a))
print ( int (a))
print ( hex (a))
- - - - -
0b1100100 0o144 100 0x64 |
13. pow(2,10)表示的十次方
1
2
3
|
print ( pow ( 2 , 10 ))
- - -
1024 |
14,reverse:反转
round:四舍五入
sorted:排序
zip:把两个序列合起来变成一个元组
1
2
3
4
5
6
7
8
|
li = [ 11 , 2 , 44 , 223 ]
print ( list ( reversed (li)))
li.reverse() print (li)
- - - - -
[ 223 , 44 , 2 , 11 ]
[ 223 , 44 , 2 , 11 ]
|
1
2
3
|
print ( round ( 1.8 ))
- - - - -
2 |
1
2
3
4
5
|
l = [ 11 , 2 , 44 , 223 ]
lo = sorted (l)
print (lo)
- - - - - -
[ 2 , 11 , 44 , 223 ]
|
1
2
3
4
5
6
|
l1 = [ 11 , 2 , 44 , 223 ]
l2 = [ 22 , 2 , 44 , 223 ]
r = zip (l1,l2)
print ( list (r))
- - - - - -
[( 11 , 22 ), ( 2 , 2 ), ( 44 , 44 ), ( 223 , 223 )]
|
第三周作业 解析
raw_input 获取的用户输入是字符串
1
2
3
4
5
6
|
input_str = raw_input ( "请输入内容:" )
#如: #用户输入:123 则 input_str = "123" #用户输入:hello 则 input_str = "hello" #用户输入:{"k1":123, "k2": "wupeiqi"} 则 input_str = ' {"k1":123, "k2": "wupeiqi"} ' |
################# raw_input 获取到的输入都是字符串、字符串、字符串 !!!!!!! #################
因为raw_input 获取的是字符串,所以用户输入的 ' {"k1":123, "k2": "wupeiqi"} ' 不具有字典的特性,也就不能使用 dic['key'] 来获取值
如果想要将用户输入的内容转换下格式,
1
2
|
'{"k1":123, "k2": "wupeiqi"}' 字符串转换成字典类型
"[11,22,33,44]" 字符串转换成列表类型
|
################# 当当当当,python的json模块可以搞搞搞 !!!!!!! #################
json模块
json模块的作用之一:根据字符串书写格式,将字符串自动转换成相应格式
1
2
3
4
5
6
7
8
|
import json
inp_str = "[11,22,33,44]"
inp_list = json.loads(inp_str) # 根据字符串书写格式,将字符串自动转换成 列表类型
inp_str = ' {"k1":123, "k2": "wupeiqi"} ' # 正确的输入 切记,内部必须是 双引号 !!!
#inp_str = " {'k1':123, 'k2': 'wupeiqi'}" # 错误的输入 inp_dict = json.loads(inp_str) # 根据字符串书写格式,将字符串自动转换成 字典类型
|
学习json有什么用呢?本次作业可以用上哦!!!!!!!
作业实例:(谁要是再不清楚作业,看我下周带皮鞭去抽他...)
需求:
老板现在给你任务,公司有haproxy配置文件,希望通过python程序可以对ha配置文件进行增删改,不再是以往的打开文件进行直接操作了。
现有ha配置文件如下:
PS:以下只是实例,有好的想法也是可以的!
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
输出: 1 、获取ha记录
2 、增加ha记录
3 、删除ha记录
num = raw_input ( '请输入操作序号:' )
如果用户输入的 1 :
read = raw_input ( '请输入backend:' ) 如输入:www.oldboy.org
讲配置文件 backend www.oldboy.org 节点下的所有记录获取到,并输入到终端
如果用户输入的 2 :
read = raw_input ( '请输入要新加的记录:' ) 如: { "backend" : "test.oldboy.org" , "record" :{ "server" : "100.1.7.9" , "weight" : 20 , "maxconn" : 30 }}
# 讲read字符串转换成 字典类型
read_dict = json.loads(read)
backend_title = read_dict[ 'backend' ]
# 去配置文件中找到指定的节点:
# backend test.oldboy.org
# 如果已经存在,
# 则在此节点下添加根据用输入构造出的记录,例如:
server 100.1 . 7.9 100.1 . 7.9 weight 20 maxconn 3000
# 如果不存在,
# 则添加backend节点和记录,例如:
backend test.oldboy.org
server 100.1 . 7.9 100.1 . 7.9 weight 20 maxconn 3000
# (可选)可以再对节点下记录进行判断是否已经存在
如果用户输入的 3 :
read = raw_input ( '请输入要删除的记录:' ) 如: { "backend" : "test.oldboy.org" , "record" :{ "server" : "100.1.7.9" , "weight" : 20 , "maxconn" : 30 }}
# 讲read字符串转换成 字典类型
read_dict = json.loads(read)
backend_title = read_dict[ 'backend' ]
#去配置文件中找到指定的节点,并在删除指定记录,如:
backend test.oldboy.org
server 100.1 . 7.10 100.1 . 7.10 weight 20 maxconn 3000
server 100.1 . 7.9 100.1 . 7.9 weight 20 maxconn 3000 # 删除掉
# (可选)如果backend下所有的记录都已经被删除,那么将当前 backend test.oldboy.org 也删除掉。
|
装饰器
软件开发的开放封闭原则:如果用户新增需求,对于原有的类和函数内部不要改,外部来修改功能。
装饰器
装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作。
格式:@+函数名,放在要装饰的函数前面:自动执行wrapper函数,将foo函数作为参数传给wrapper
1
2
3
4
5
6
7
8
9
10
11
|
def wrapper(func):
def result():
print ( 'before' )
func()
print ( 'after' )
return result
@wrapper def foo():
print ( 'foo' )
|
执行步骤:
用户调用foo函数的时候,先执行wrapper函数。
然后将foo函数整体作为一个参数传入给func这个形式参数。
执行result函数。(1,打印before;2,执行func(),就是调用foo函数;3,打印after。)
给出result函数的返回值。
1,准备知识
如果一个函数返回值,则返回none
把一个函数作为参数传入另外一个函数,则调用形式参数就是执行原函数
-
如果一个函数那个过程中遇到return语句结束。
1234567891011121314151617def
f1():
print
(
123
)
def
f1():
print
(
456
)
f1()
def
f1():
print
(
'123'
)
def
f2(xxx):
xxx()
f2(f1)
-
-
-
-
-
456
123
2,装饰器参数(万能参数)
使用这个样的装饰器可以接受万能参数,在函数调用的时候,只要传入了对应的参数均可行
注意装饰器中内部函数inner要接受原函数的返回值,保证原函数不受不受影响。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
def outer(func):
def inner( * args, * * kwargs):
print ( 'before' )
r = func( * args, * * kwargs)
print ( 'after' )
return r
return inner
# @ + 函数名 # 功能: # 1. 自动执行outer函数并且将其下面的函数名f1当作参数传递 # 2. 将outer函数的返回值,重复赋值给 f1 @outer def f1(arg):
print (arg)
return "砍你"
@outer def f2(a1, a2):
print ( "F2" )
# @outer def f3():
print ( "F3" )
|
3,装饰器的主要应用(权限控制)
这段代码很好地控制了登陆权限,在每个需要登录的功能外部,通过装饰器,控制登陆状态。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
LOGIN_USER = { "is_login" : False }
def outer(func):
def inner( * args, * * kwargs):
if LOGIN_USER[ 'is_login' ]:
r = func()
return r
else :
print ( "请登录" )
return inner
def outer1(func):
def inner( * args, * * kwargs):
if LOGIN_USER[ 'is_login' ] and LOGIN_USER[ 'user_type' ] = = 2 :
r = func()
return r
else :
print ( "请登录,或者权限不够" )
return inner
@outer1 def order():
print ( "欢迎%s登录" % LOGIN_USER[ 'current_user' ])
@outer def changepwd():
print ( "欢迎%s登录" % LOGIN_USER[ 'current_user' ])
@outer def manager():
print ( "欢迎%s登录" % LOGIN_USER[ 'current_user' ])
def login(user, pwd):
if user = = "alex" and pwd = = "123" :
LOGIN_USER[ 'is_login' ] = True
LOGIN_USER[ 'current_user' ] = user
manager()
def main():
while True :
inp = input ( "1,后台管理;2,登录" )
if inp = = '1' :
manager()
elif inp = = '2' :
username = input ( "请输入用户名" )
pwd = input ( "请输入密码" )
login(username, pwd)
main() |