python13_day4
上周复习
1,python基础
2,基本数据类型
3,函数式编程
函数式编程、三元运行、内置函数、文件处理
容易出问题的点
函数默认返回值为none,对于列表字典,传入引用。
1234567891011121314151617#函数没有返回值的时候返回noneli=[11,22,33,44]deff2(arg):arg.append(li)ret=f2(li)print(ret)-----none#字典,列表等传值传引用li=[11,22,33,44]deff2(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)-------A97 |
随机数小程序
|
1
2
3
4
5
6
7
8
9
10
11
12
|
#注意这里取得是A-Z(65-90)实际这里的应该用65-91,取头舍尾import randomi = 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 randomli = []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>12364None24 |
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)156 |
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 = 0for index, line in enumerate(open('db','r')): count += 1print(count)----------55 |
6,isinstance:判断对象是某个类的实例(bool值)。
对象和类的关系:对象是类的实例
eg:s="alex"对象,他的类是字符串str。对象和类内部关联,在使用这个对象的时候就会调用换个对象类的方法。
|
1
2
3
4
5
6
7
8
9
|
s = "alex" # 对象,"alex" => strs = [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 Trueli = [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))-----TrueFalse |
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))------5511165 |
12.bin,oct,int,min 分别可以做二进制、八进制、十进制、十六进制的转换。
|
1
2
3
4
5
6
7
8
9
10
|
a = 100print(bin(a))print(oct(a))print(int(a))print(hex(a))-----0b11001000o1441000x64 |
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 jsoninp_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@wrapperdef foo(): print('foo') |
执行步骤:
用户调用foo函数的时候,先执行wrapper函数。
然后将foo函数整体作为一个参数传入给func这个形式参数。
执行result函数。(1,打印before;2,执行func(),就是调用foo函数;3,打印after。)
给出result函数的返回值。

1,准备知识
如果一个函数返回值,则返回none
把一个函数作为参数传入另外一个函数,则调用形式参数就是执行原函数
如果一个函数那个过程中遇到return语句结束。
1234567891011121314151617deff1():print(123)deff1():print(456)f1()deff1():print('123')deff2(xxx):xxx()f2(f1)-----456123
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@outerdef f1(arg): print(arg) return "砍你"@outerdef f2(a1, a2): print("F2")#@outerdef 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 @outer1def order(): print("欢迎%s登录" % LOGIN_USER['current_user'])@outerdef changepwd(): print("欢迎%s登录" % LOGIN_USER['current_user'])@outerdef 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() |
python13_day4的更多相关文章
随机推荐
- win10如何合并硬盘分区
好多人都会讲电脑硬盘分成几个不同的区,以方便自己的资料的存储和查找,但不少人不知道如何合并已经分出的硬盘分区.以下是我的经验,与大家分享: 1. 首先,右击“此电脑”,在弹出来的右键菜单这种选择“ ...
- 个人C++学习路线
这段时间学习<<C++ primer >> 第四版,一边学一遍考虑,要怎么样往深处学习.查了网上的学习路线,知乎大神的问题回答,整理了一下思路,如下吧: <<C++ ...
- linux计算程序运行时间
转自: http://www.cnblogs.com/NeilHappy/archive/2012/12/08/2808417.html #include <sys/time.h> int ...
- 机器学习基石 3 Types of Learning
机器学习基石 3 Types of Learning Learning with Different Output Space Learning with Different Data Label L ...
- 免费搭建wordpress博客有感
之前一直有搭建个wordpress博客的想法,但一直没有实施.最近离职之后,空闲时间多了起来,就开始折腾wordpress博客起来. wordpress博客可玩性很高,但刚开始只想练练手,就没有想买域 ...
- 老司机实战Windows Server Docker:1 初体验之各种填坑
前言 Windows Server 2016正式版发布已经有近半年时间了,除了看到携程的同学分享了一些Windows Server Docker的实践经验,网上比较深入的资料,不管是中文或英文的,都还 ...
- ViewPager 滑动一半的判断方法以及左滑右滑判断
做项目的时候,会碰到用viewpager + fragments去实现多页滑动.有些时候需要完成:界面在滑动到一半或是一半以上的时候,需要把title之类的切换到下一个页面.这个时候仅仅依赖Viewp ...
- iOS网络编程笔记——编写自己的网络客户端
编写网络客户端主要有四个步骤: (1)项目中引入Accounts和Social框架 Accounts框架中有进行用户账户认证所需类,Social框架提供了我们所需要的SLRequest类. (2)用户 ...
- RequireJS基础知识
RequireJS解决代码依赖问题,异步加载js,避免页面失去相应 RequireJS的目标是鼓励代码的模块化,它使用了不同于传统<script>标签的脚本加载步骤.可以用它来加速.优化代 ...
- input的type属性引申的日历组件
HTML5规范里只规定date新型input输入类型,并没有规定日历弹出框的实现和样式.所以,各浏览器根据自己的设计实现日历.目前只有谷歌浏览器完全实现日历功能.相信这种局面很快就会结束,所有的浏览器 ...