Python之类一

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/18 16:14
# @Author : Ropon
# @File : 22_01.py

#1、面向过程编程
#2、函数式编程
# def func(arg):
# pass

# func(1)
# func(2)

# 为什么要将某些函数写到指定文件中?
# 对函数进行归类

# 函数式编程与面向对象编程区别:
# 函数
# def email(em, text):
# """
# 发送邮件
# """
# print(em, text)
#
# def msg(tel, text):
# """
# 发送短信
# """
# print(tel, text)
#
# def webchat(num, text):
# """
# 发送微信
# """
# print(num, text)
#
# if 1 == 1:
# email('11@qq.com', '测试发送邮件')
# msg('13xxxxxx', '测试发送短信')
# webchat('ropon', '测试发送微信')

# 面向对象
# class Message:
# def email(self, em, text):
# """
# 发送邮件
# """
# print(em, text)
#
# def msg(self, tel, text):
# """
# 发送短信
# """
# print(tel, text)
#
# def webchat(self, num, text):
# """
# 发送微信
# """
# print(num, text)
#
# if 2 == 2:
# obj = Message()
# obj.email('11@qq.com', '测试发送邮件')
# obj.msg('13xxxxxx', '测试发送短信')
# obj.webchat('ropon', '测试发送微信')

# 对比:
# 函数:定义简单、调用简单
# 面对对象:定义复杂、调用复杂 好处:归类,将某些类似的函数写在一起

# 总结:
# 函数式编程可能比面向对象好
# Python中支持两种编程方式
# 面向对象方式格式
# 定义:
# class 类名: 定义一个类
# def 函数名(self): 类中编写一个方法
# pass
# 调用
# x1 = 类名() 创建一个对象或者说实例化一个对象
# x1.函数名() 调用对象中的一个方法
# 构造方法
# class Foo:
# def __init__ (self, name): # 构造方法,目的进行数据初始化
# self.name = name
# self.age = 18
# obj = Foo('测试')
# print(obj.name)
# 通过构造方法,可以将数据进行打包,以后使用时,去其中获取即可

# 将数据封装到对象中,以供其他函数调用

# def func1(arg):
# print(arg.name)
# print(arg.os)
# print(arg.cpus)
#
# class Ebs:
# def __init__(self, name, os ,cpus):
# self.name = name
# self.os = os
# self.cpus = cpus
#
# obj = Ebs('ebs-1', 'centos7.5', '4')
# func1(obj)

# 1 查看用户信息
# 2 查看用户账单
# 3 购买抱枕
# 4 退出
# 请选择您需要做的操作:

# class UserInfo:
#
# def __init__(self):
# self.name = None
#
# def info(self):
# print('当前用户名称是{0}'.format(self.name))
#
# def account(self):
# print('用户{0}的账单是...'.format(self.name))
#
# def shopping(self):
# print('用户{0}购买了一个抱枕...'.format(self.name))
#
# def login(self):
# name = input('请输入用户名:')
# passwd = input('请输入密码:')
# if name == 'ropon' and passwd == '123':
# self.name = name
# while 1:
# lst = ['查看用户信息', '查看用户账单', '购买抱枕', '退出']
# for num, index in enumerate(lst, 1):
# print(num, index)
# num = int(input('请选择您需要做的操作:'))
# if num == 1:
# self.info()
# elif num == 2:
# self.account()
# elif num == 3:
# self.shopping()
# elif num == 4:
# exit()
# else:
# print('非法选项,请重新选择')
# else:
# print('登录失败')
#
# obj = UserInfo()
# obj.login()

# class Demo:
# def __init__(self, name):
# self.name = name
#
# def msg(self,text):
# print(self.name, text)
#
# obj = Demo('ropon')
# obj.msg('再次测试发送信息')

# 面向对象三大特性:封装、继承、多态
# 封装
# 将相关功能封装到一个类中
# 将数据封装到一个对象中

# 继承
# 编写格式
# class 子类名(父类名):
# pass
# 调用子类方法,优先在子类中找,如果找不到就到父类找
# 继承提高代码重用性
# 支持多继承(先找左/再找右)

# class Vhost:
# def func1(self):
# print('func1')
#
# class OpVhost(Vhost):
# def func2(self):
# print('func2')
#
# class LsVhost(OpVhost):
# def func3(self):
# print('func3')
#
# def func1(self):
# print('LsVhost.func1')
#
# class Tvhost(LsVhost, OpVhost, Vhost):
# def func4(self):
# print('func4')
#
# obj = Tvhost()
# obj.func3()
# obj.func2()
# obj.func1()
# obj.func4()

# 多态
# 相同调用方式,不同的执行效果(多态性)

# class Site:
# def list(self):
# print('site.list')
#
# class Ftp:
# def list(self):
# print('ftp.list')
#
# class Db:
# def list(self):
# print('db.list')
#
# def func1(arg):
# arg.list()
#
# obj = Site()
# # obj = Ftp()
# # obj = Db()
# func1(obj)

Python之模块导入

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/18 15:07
# @Author : Ropon
# @File : 21_01.py

# 给导入模块起个别名,以后可通过别名调用此模块
import pickle as pk

# 导入多个模块,但是模块建议一个一个导入
import os,time

# 模块导入过程import
# 找到这个模块
# 判断模块是否被导入过
# 如果没有导入过
# 创建一个属于这个模块的命名空间
# 让模块的名字指向这个空间
# 执行这个模块中的代码

# from xx import xx 导入过程
# 找到这个模块
# 判断模块是否被导入过
# 如果没有导入过
# 创建一个属于这个模块的命名空间
# 执行这个文件
# 找到你要导入的变量
# 给你导入的变量创建一个引用,指向导入的变量

# from my_module import read1 as re1
# def read1():
# print("my read1")
# read1()
# re1()

# from my_module import read2
# read2()

# import time
# import my_module
#
# time.sleep(3)
# my_module.read1()

Python 之异常处理

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/17 14:24
# @Author : Ropon
# @File : 20_01.py

# 异常是什么,比如:
# IndexError [][1]
# KeyError {}['key']
# EOFError pickle.load()
# FileNotFoundError open('aaaa')
# ModuleNotFoundError import aaaaaaadfdsdf
# ValueError int('dsfsdfsdf')

# 语法错误,编写代码时就应该规避掉
# SyntaxError
# NameError name

# 什么时候容易出现异常,当您输入的内容不确定,比如:
# 有用户参与输入
# 有外界数据介入,比如从文件中读,从网络中获取

# 多行报错的原因是:一般在嵌套调用过程中,内部代码出现异常,外部所有调用的地方都成为报错追溯信息的一部分

# def func1():
# name
#
# def func2():
# func1()
#
# def func3():
# func2()
#
# def main():
# func3()
#
# main()

# 遇到多行报错,如何分析
# 从下往上分析,逐个检查出错行,分析您自己写的代码
# 如果找不到问题,就将最后一行的错误类型及详细提示复制到百度搜索

# lst = ['login', 'register']
# for num, i in enumerate(lst , 1):
# print(num, i)
#
# try:
# num = int(input("num >>"))
# print(lst[num - 1])
# except ValueError:
# print("请输入一个数字")

# lst = ['login', 'register']
# for num, i in enumerate(lst , 1):
# print(num, i)
# try:
# num = int(input("num >>"))
# print(lst[num - 1])
# except ValueError:
# # 从上往下错误代码,匹配到一个报错类型分支就执行这个分支中的代码,然后退出分支
# print("请输入一个数字")
# except IndexError:
# # 如果找不到匹配的分支,就一直往下查找,最后依然没有找到匹配就报错
# print("只能输入1或2")

#合并多分支
# lst = ['login', 'register']
# for num, i in enumerate(lst , 1):
# print(num, i)
# try:
# num = int(input("num >>"))
# print(lst[num - 1])
# except (ValueError, IndexError):
# print("输入不合法")

#万能异常
# def buy():
# print("buy")
# name
#
# def back():
# print("back")
# [][1]
#
# def show():
# print("show")
# 1/0
#
# def main():
# lst = [('购物', buy), ('退货', back), ('查看订单', show)]
# while 1:
# for num, i in enumerate(lst, 1):
# print(num, i[0])
# num = int(input("num >>>"))
# try:
# print(lst[num - 1])
# func = lst[num - 1][1]
# func()
# except (ValueError, IndexError):
# print('您输入的内容不合法')
# except Exception:
# print("用户选择%s操作之后发生未知错误" % lst[num - 1][0])
#
# if __name__ == '__main__':
# main()

# as语法 能够将具体错误信息打印出来
# def buy():
# print("buy")
# name
#
# def back():
# print("back")
# [][1]
#
# def show():
# print("show")
# 1/0
#
# def main():
# lst = [('购物', buy), ('退货', back), ('查看订单', show)]
# while 1:
# for num, i in enumerate(lst, 1):
# print(num, i[0])
# num = int(input("num >>>"))
# print(lst[num - 1])
# try:
# func = lst[num - 1][1]
# func()
# except Exception as e:
# print(e)
# print("用户选择%s操作之后发生未知错误" % lst[num - 1][0])
#
# if __name__ == '__main__':
# main()
# 万能异常相当于except Exception
# try:
# name
# [][1]
# int('aaa')
# # except:
# except Exception:
# print("123")

# 多分支 万能异常,万能异常应该永远放到异常处理最下面

# def buy():
# print("buy")
# name
#
# def back():
# print("back")
# [][1]
#
# def show():
# print("show")
# 1/0
#
# def main():
# lst = [('购物', buy), ('退货', back), ('查看订单', show)]
# while 1:
# for num, i in enumerate(lst, 1):
# print(num, i[0])
# num = int(input("num >>>"))
# try:
# print(lst[num - 1])
# func = lst[num - 1][1]
# func()
# except (ValueError, IndexError):
# print('您输入的内容不合法')
# except Exception:
# print("用户选择%s操作之后发生未知错误" % lst[num - 1][0])
#
# if __name__ == '__main__':
# main()

# 总结
# try:
# pass
# except (ValueError,IndexError):
# print("针对性处理异常")
# except Exception as e:
# print("通用办法处理异常")

# else分支
# try:
# print("test")
# # name
# # [][1]
# # 1/0
# except NameError:
# print("NameError")
# except IndexError:
# print("IndexError")
# except Exception as e:
# print(e)
# else:
# print("else")

# finally分支
# try:
# print("test")
# # name
# # [][1]
# # 1/0
# except NameError:
# print("NameError")
# except IndexError:
# print("IndexError")
# except Exception as e:
# print(e)
# else:
# print("else")
# finally: # 无论如何都会被执行
# print("finally")

# def func():
# f = open('test.txt', 'r')
# try:
# while 1:
# for line in f:
# if line.startswith('a'):
# return line
# except:
# print("异常处理")
# finally: # 即使return也会先执行fianlly中的代码
# f.close()
#
# print(func())

# try:
# f = open('test.txt', 'r')
# f.read()
# name
# finally: #即使程序报错,在程序结束之前也会执行此分支代码
# f.close()
# print("已关闭打开的文件")

# finally 通常用来回收一些系统的资源,比如数据连接,打开的文件,网络连接等
# 异常处理常用:
# try ... except
# try ... except ... else
# try ... finally
# try ... except ... finally
# try ... except ... else ... finally

# 主动抛出异常,主要是给其他开发者看的
# raise ValueError("你写的不正确")

# python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。
# 可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
# assert 2==1 False
# assert 1==1 True
# print("test")

# if 1 == int(input()):
# print("test")
# else:
# raise AssertionError

# 自定义异常

# 最外层的异常处理应该在所有开发完成后才考虑,一般最后将错误写到文件中。
# def main():
# name
# try:
# main()
# except Exception as e:
# with open('error.log', 'a', encoding='utf-8') as f:
# f.write(str(e))

Python之常用模块二

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/15 10:30
# @Author : Ropon
# @File : 19_01.py
import os

# os.path.abspath # 将路径中不规范的/ 改成当前操作系统默认格式
# path = os.path.abspath('D:/Ropon\Seafile/Work\python\code\day19')
# print(path)
# 将相对路径下文件转换为绝对路径
# path = os.path.abspath('19_01.py')
# print(path)

# os.path.split # 分割路径,第一元素是路径,第二元素是文件或文件夹
# path= os.path.split('D:/Ropon/Seafile/Work/python/code/day19/19_01.py')
# path= os.path.abspath('D:/Ropon/Seafile/Work/python/code/day19/19_01.py')
# print(path)

# print(os.path.dirname('D:/Ropon/Seafile/Work/python/code/day19/19_01.py')) # 前面绝对路径
# print(os.path.basename('D:/Ropon/Seafile/Work/python/code/day19/19_01.py')) # 文件名
# 总结:
# 如果路径和文件名都需要使用os.path.split
# 如果只要其中之一使用os.path.dirname/os.path.basename

# 判断文件或文件夹是否存在,返回布尔值,存在True,反之False
# print(os.path.exists('D:/Ropon/Seafile/Work/python/code/day19'))

# print(os.path.isabs('D:/Ropon/Seafile/Work/python/code/day19')) # 如果path是绝对路径,返回True

# print(os.listdir('D:/Ropon/Seafile/Work/python/code')) # 列出所有文件及子目录,包括隐藏文件
# print(os.path.isdir('D:/Ropon/Seafile/Work/python/code/day19')) # 判断是否是目录
# print(os.path.isfile('D:/Ropon/Seafile/Work/python/code/day19/19_01.py')) # 判断是否是文件

# print(os.path.join('D:/Ropon/Seafile/Work/python/code/day19', '19_01.py')) # 拼接目录

# print(os.path.getsize('D:\Ropon\Seafile\Work\python')) # 所有的文件夹 都至少是4096个字节
# print(os.path.getsize('D:/Ropon/Seafile/Work/python/code/day19/19_01.py')) # 获取文件字节大小

# 递归统计某个路径下及子目录下文件的大小
# def getfilesize(path):
# size_sum = 0
# dirnames = os.listdir(path)
# print(dirnames)
# for dirname in dirnames:
# pathname = os.path.join(path, dirname)
# if os.path.isdir(pathname):
# size = getfilesize(pathname)
# size_sum += size
# else:
# size_sum += os.path.getsize(pathname)
# return size_sum
#
# res = getfilesize('D:\Ropon\Seafile\Work\python\code\day19')
# print(res)

# lst = ['D:\Ropon\Seafile\Work\python\code\day19',] # 列表的第一个目录就是我要统计的目录
# size_sum = 0
# while lst:
# path = lst.pop()
# path_list = os.listdir(path)
# for name in path_list: # name = day01
# abs_path = os.path.join(path,name)
# if os.path.isdir(abs_path):
# lst.append(abs_path)
# else:
# size_sum += os.path.getsize(abs_path)
# print(size_sum)

# os.system() # 运行shell等命令,直接显示
# os.popen().read() # 运行shell等命令,获取执行结果
# os.getcwd() # 获取当前工作目录,即当前python脚本工作的目录
# os.chdir() # 改变当前脚本工作目录,相当于shell 中cd 命令

# os.path.getsize() # 统计文件大小,文件夹都是4096字节

# 列出目录下所有文件及文件夹
# os.system('dir D:\Ropon\Seafile\Work\python\code\day19')
# print(os.listdir('D:\Ropon\Seafile\Work\python\code\day19'))

# print(eval("4+6"))
# exec("""
# for i in range(10):
# print(i)"""
# )

# eval("字符串数据类型的Python代码")
# exec("执行字符串数据类型的Python代码")

# os.system("执行字符串数据类型的操作系统命令")
# os.popen("执行字符串数据类型的操作系统命令,并返回结果,通过.read()获取")

Python之常用模块一

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/14 14:27
# @Author : Ropon
# @File : 18_01.py

#常用模块一
# random
# time
# os
# sys
# 序列化模块
# json
# pickle
# collections 数据类型扩展,面向对象进阶

import random

# 取随机小数:数学计算
# print(random.random()) #取0-1之间的小数
# print(random.uniform(1, 2)) 取1-2之间的小数

# 取随机整数:彩票 抽奖
# print(random.randint(1, 2)) #[1, 2] 顾头也顾尾
# print(random.randrange(1, 2)) #[1, 2) 顾头不顾尾
# print(random.randrange(1, 100, 2)) #[1, 3, 5, 7 ...) 顾头不顾尾

# 从一个列表中随机取值:抽奖
# lst = ['a', 'b', (1, 2), 123]
# print(random.choice(lst))
# print(random.sample(lst, 2)) #随机取2个不重复的值

# 打乱一个列表顺序,在原列表基础上修改,节省空间:洗牌
# random.shuffle(lst)
# print(lst)

# 验证码
# 4位数字验证码
# 6位数字验证码
# 6位数字+字母验证码

# 4位或6位数字验证码
# def func(n=6):
# s = ''
# for i in range(n):
# num = (random.randint(0, 9))
# s += str(num)
# return s
#
# print(func())
# print(func(4))

# 6位数字+字母验证码
# print(chr(65)) #65+25 97+25
# print(chr(97))
# def func(n=6):
# s = ''
# for i in range(n):
# num = str(random.randint(0, 9))
# alpha_upper = chr(random.randint(65, 90))
# alpha_lower = chr(random.randint(97, 122))
# res = random.choice([num, alpha_upper, alpha_lower])
# s += res
# return s
#
# print(func())
# print(func(4))

# 4位数字验证码
# 6位数字验证码
# 6位数字+字母验证码

# def func(n = 6, alpha = True):
# s = ''
# for i in range(n):
# num = str(random.randint(0, 9))
# if alpha:
# alpha_upper = chr(random.randint(65, 90))
# alpha_lower = chr(random.randint(97, 122))
# num = random.choice([num, alpha_upper, alpha_lower])
# s += num
# return s
#
# print(func())
# print(func(4,False))



# 发红包
# 红包数量 钱数
# 拼手机红包

# def hongbao(amount=5, count=3):
# s = []
# min = 1 #分
# amount = amount * 100 #单位分
# max = amount - (count-1) #单位分
# for i in range(count-1):
# # num = random.randint(0, amount)
# num = random.uniform(0, int(amount))
# while num < min or num > max:
# num = random.uniform(0, int(amount))
# amount -= num
# s.append(round((num / 100), 2))
# s.append(round((amount / 100), 2))
# random.shuffle(s)
# return s

# def hongbao(amount=5, count=3):
# s = []
# min = 1 #分
# amount = amount * 100 #单位分
# max = amount - (count-1) #单位分
# for i in range(count-1):
# num = random.randint(0, amount)
# # while num < min or num > max:
# # num = random.randint(0, amount)
# amount -= num
# s.append(round((num / 100), 2))
# s.append(round((amount / 100), 2))
# random.shuffle(s)
# return s
#
# print(hongbao(1, 6))

# 0--------------------------------20
# 0 2 4 10 16 20

# def hongbao(amount=10, count=5):
# ret = random.sample(range(1, amount * 100), count - 1) #分为单位
# ret.extend([0, amount * 100]) #追加多个值0 amount * 100
# ret.sort() #排序
# # return [((ret[i+1] - ret[i]) / 100 for i in range(num))] # 列表生产式
# for i in range(count):
# yield (ret[i+1] - ret[i]) / 100
#
# res = hongbao(10, 6)
# for i in res:
# print(i)

# def redbags(money, num=10):
# choice = random.sample(range(1, money * 100), num - 1)
# choice.extend([0,money*100])
# choice.sort()
# return [(choice[i + 1] - choice[i]) / 100 for i in range(num)]
# print(redbags(100,10))

# def hongbao(money,n):
# k=n
# sum=0#sum为前n个人抢得的总和,为了方便计算最后一个人的金额,初始值为0
# round=n#剩余人次
# while k>1:
# current_money = money # 当前剩余的钱,初始值为money
# for i in range(1,n+1):
# get_money=random.randint(0,int(2*current_money/round))
# print('id[%s] have geted money %s'%(i,get_money))
# current_money -= get_money
# round -= 1
# sum += get_money
# k-=1
#
#
# if k==1:#最后一个人,分得剩余的所有
# print('id[%s] have geted money %s'%(n,money-sum))
# print(current_money)
# print(hongbao(100,10))

def hongbao(amount=5, count=3):
s = []
sum = 0 #分
amount = amount * 100 #单位分
for i in range(count-1): #0 1 2
max = amount -sum - (count - 1 - i) # 单位分 500-(3-1-0)=498
num = random.randint(1, max) #1,498 400
s.append((num / 100))
sum = sum + num
s.append((amount - sum) / 100)
random.shuffle(s)
return s

print(hongbao(100, 8))
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/14 15:42
# @Author : Ropon
# @File : 18_02.py

import time

# time.sleep(2)
# print("123")

# 时间格式
# 字符串 格式化时间 人能识别的
# 结构化时间
# 时间戳 1970-1-1 0:0:0 英国伦敦时间 以秒为单位 计算机能识别的
# print(time.time())
# print(time.strftime('%Y-%m-%d %H:%M:%S'))
# print(time.strftime('%y-%m-%d %H:%M:%S'))
# print(time.strftime('%c'))

# print(time.localtime())
# time.struct_time(tm_year=2018, tm_mon=10, tm_mday=14, tm_hour=15, tm_min=49, tm_sec=45, tm_wday=6, tm_yday=287, tm_isdst=0)
# tm_isdst=0 是否夏令时

# struct_time = time.localtime()
# print(struct_time.tm_year)

# 时间戳换成字符串时间
# print(time.time())
# struct_time = time.localtime(1500000000)
# ret = time.strftime('%Y-%m-%d %H:%M:%S', struct_time)
# print(ret)

# 字符串转换时间戳
# struct_time = time.strptime('2018-8-8', '%Y-%m-%d')
# print(struct_time)
# res = time.mktime(struct_time)
# print(res)

# 1.查看一下2000000000时间戳时间表示的年月日
# 时间戳 --> 结构化 --> 格式化
# struct_time = time.localtime(2000000000)
# # print(struct_time)
# print(time.strftime('%Y-%m-%d', struct_time))

# 2.将2008-8-8转换成时间戳时间
# struct_time = time.strptime('2008-8-8', '%Y-%m-%d')
# print(time.mktime(struct_time))

# 3.请将当前时间的当前月1号的时间戳时间取出来 - 函数
#2018-10-1
# def get_time():
# st = time.localtime()
# st2 = time.strptime('{0}-{1}-1'.format(st.tm_year, st.tm_mon), '%Y-%m-%d')
# return time.mktime(st2)
# print(get_time())

# 4.计算时间差 - 函数
# 2018-8-19 22:10:8 2018-8-20 11:07:3
# 经过了多少时分秒

# def func(str_time1, str_time2):
# # str_time1 = '2018-8-19 22:10:8'
# # str_time2 = '2018-8-20 11:07:3'
# struct_t1 = time.strptime(str_time1, '%Y-%m-%d %H:%M:%S')
# struct_t2 = time.strptime(str_time2, '%Y-%m-%d %H:%M:%S')
# timetamp1 = time.mktime(struct_t1)
# timetamp2 = time.mktime(struct_t2)
# sub_time = timetamp2 - timetamp1
# gm_time = time.gmtime(sub_time)
# #1970-1-1 00:00:00
# return '过去了{0}年{1}月{2}日{3}时{4}分{5}秒'.format(gm_time.tm_year-1970, gm_time.tm_mon-1, gm_time.tm_mday-1,
# gm_time.tm_hour, gm_time.tm_min, gm_time.tm_sec)
# s1 = '2018-10-12 22:10:10'
# s2 = '2018-10-14 23:09:07'
# print(func(s1, s2))
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/14 20:36
# @Author : Ropon
# @File : 18_03.py

import sys

# sys 是和Python解释器交互模块
# sys.argv
# print(sys.argv) # argv的第一个参数 是python命令的后面的值

# usr = sys.argv[1]
# pwd = sys.argv[2]
# if usr == 'ropon' and pwd == '123':
# print("登录成功")
# else:
# exit()

# 1、程序员 运维人员 在命令行运行代码
# 2、操作系统 陷入input事件,程序阻塞,从而退出CPU竞争

# sys.path
# print(sys.path) # 模块搜索路径
# 模块存在硬盘中,impor 模块 --> 载入内存中
# 也就是说一个模块是否能被顺利导入,导入时依次从sys.path 列表中每个元素对应路径开始寻找。
# 自定义模块
# sys.modules
import re
# print(sys.modules) # 是我们导入到内存中所有模块的名字或者说是模块的内存地址
# print(sys.modules['re'].findall('\d', 'dfsd43534'))
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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/14 21:03
# @Author : Ropon
# @File : 18_04.py

import os
# os 与操作系统交互的模块
# os.makedirs('test1/test2') # 可创建多级文件夹
# os.mkdir('test3') # 仅创建一级文件夹
# os.mkdir('test3/test4') # 仅创建一级文件夹

# os.removedirs('test1/test2') # 若目录为空,则删除,并递归上级目录,若为空,则删除,以此类推
# os.rmdir('test3/test4') # 删除单级空目录,若目录不为空则无法删除报错

# print(os.stat('D:/Ropon/Seafile/Work/python/code/day18/18_04.py')) # 获取文件或目录信息

# exec/eval 执行的是字符串类型的python代码
# os.system() 和 os.popen() 执行的是字符串类型的命令行代码
# os.system('test.bat') # 运行shell/bat命令,直接显示,或者说执行操作系统命令,没有返回值
# st = os.popen('test.bat').read() # 运行shell/bat命令,通过.read()获取执行结果
# print(st)
# ret = os.popen('dir')
# s = ret.read()
# # print(s)
# print(s.split('\n'))

# os.listdir() # 列出指定目录下所有文件和子目录,包括隐藏文件,并以列表形式打印
# os.path.join(path1[, path2[, ...]]) # 拼接目录,第一个绝对路径之前的参数将被忽略
# print(os.path.join('test', 'D:\Ropon', 'python'))
# files = os.listdir('D:\Ropon\Seafile\Work\python\code')
# for path in files:
# print(os.path.join('D:\Ropon\Seafile\Work\python\code', path))

# os.getcwd() # 获取当前工作目录,即当前python脚本工作目录
# print(os.getcwd())

# os.chdir() # 切换当前脚本工作目录
# os.chdir('D:\Ropon\Seafile\Work')
# ret = os.popen('dir')
# s = ret.read()
# print(s)

# os.rename("oldname","newname") # 重命名文件/目录
# os.remove() # 删除一个文件

Python 发红包算法

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
#算法一
思路
sum =0
amount=500分 count=4个人抢
1 - 500-(4-1-0) -0 i = 0
1. 1 - 1-497 num = 400
sum = sum + num 0+400
1 - 500-(4-1-1) -400
2. 1 - 82 num = 50
sum = sum + num 400 +50
1- 500 -(4-1-2) -450
3. 1 - 49 num =49
sum = sum+49=491
amount -sum 1 / 100
#################################################################
def hongbao(amount=5, count=3):
s = []
sum = 0 #分
amount = amount * 100 #单位分
for i in range(count-1): #0 1 2
max = amount -sum - (count - 1 - i) # 单位分 500-(3-1-0)=498
num = random.randint(1, max) #1,498 400
s.append((num / 100))
sum = sum + num
s.append((amount - sum) / 100)
random.shuffle(s)
return s

print(hongbao(5, 4))
##############################################################

算法二
#############################################################
# 0--------------------------------20
# 0 2 4 10 16 20

def hongbao(amount=10, count=5):
ret = random.sample(range(1, amount * 100), count - 1) #分为单位
ret.extend([0, amount * 100]) #追加多个值0 amount * 100
ret.sort() #排序
# return [((ret[i+1] - ret[i]) / 100 for i in range(num))] # 列表生产式
for i in range(count):
yield (ret[i+1] - ret[i]) / 100

res = hongbao(10, 6)
for i in res:
print(i)

Python之常用模块之retime

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/11 16:36
# @Author : Ropon
# @File : 17_01.py

import re

#findall 匹配所有,返回一个列表,其中是所有匹配的元素
# ret = re.findall('\d+', '测试正159则中数字258')
# ret = re.findall('\d', '测试正159则中数字258')
# print(ret)

# search 只匹配从左到右的第一个,得到不是直接结果,需要通过变量的group方法获取
# ret = re.search('[a-z]+', '测试正159则中数字aw258')
# print(ret)
# print(ret.group())

# # match 以什么开头开始匹配,相当于search中正则表达式加^,得到不是直接结果,需要通过变量的group方法获取
# ret = re.match('\d+', '1258测试')
# # ret = re.search('\d+$', '测试1258')
# print(ret)
# print(ret.group())

# 字符串处理扩展:替换、切割
# split
# s = 'roponluopeng'
# print(s.split(''))
# s = 'ropon88peng68luo28'
# ret = re.split('\d+', s)
# print(ret)

# sub 将匹配到的元素替换成新字符
# ret = re.sub('\d+', 'R', 'AbcR123测试1258')
# print(ret)

# subn 将匹配到的元素替换成新字符,返回的是一个元组,第二个参数是替换次数
# ret = re.subn('\d+', 'R', 'AbcR123测试1258')
# print(ret)

# compile
# 使用正则时,先将正则表达式编译成字节码,使用compile,先编译,多次使用不会多次编译
# ret = re.compile('\d+')
# print(ret)
# res = ret.findall('AbcR123测试1258')
# print(res)
# res = ret.search('AbcR123测试1258')
# print(res.group())

# finditer
# 返回的是迭代器,所有结果在迭代器中,通过循环及便利的group方法取值,可节省内存
# ret = re.finditer('\d+', 'AbcR123测试1258')
# for i in ret:
# print(i.group())

# 总结
# findall 查找所有匹配项,返回的是列表
# search 从左到有匹配,匹配到就返回变量,通过group取匹配的第一个值,不匹配就返回None,group会报错
# match 相当于在search中正则表达式前加^,意思以什么开头
# spilt 按正则切割,匹配到的内容会被删除,返回的是列表
# sub/subn 替换,按正在查找替换,返回替换后的内容,subn返回的是元组,第二个值是替换次数
# compile 先编译正在表达式,用编译后的结果去执行findall、search、match、finditer,可提高效率,节省时间
# finditer 返回的是迭代器,所有结果在迭代器中,通过循环及便利的group方法取值,可节省内存


# s = '<html><head><title>正则标题测试</title></head><body>正文测试<b>加粗</b></body></html>'
# ret = re.search('<title>(\w+)</title>', s)
# ret = re.search('<(\w)>(\w+)</(\w)>', s)
# ret = re.search('<(\w+)>(\w+)</(\w+)>', s)
# print(ret.group())

# 使用findall能顺利取到分组中的内容,有一个特殊的语法 >(正则表达式)<
# s = '<html><head><title>正则标题测试</title></head><body>正文测试<b>加粗</b></body></html>'
# ret = re.findall('(\w+)' ,s)
# ret = re.findall('>(\w+)<' ,s)
# print(ret)

# ret = re.findall('\d+(\.\d+)?', '8.0812*6')
# print(ret)

# 取消分组优先 (?:正则表达式)
# ret =re.findall('\d+(\.\d+)', '8.288.a8')
# print(ret)
#返回分组匹配的内容
# ret =re.findall('\d+(?:\.\d+)', '8.288.a8')
# print(ret)
#返回匹配的内容

# 分组,对于正则表达式,表示整体出现的次数 ()
# (\.[\w]+)? (\.(/w+))?
# s = '123.ab456'
# ret = re.findall('\.[\w]+', s)
# print(ret)
# ret = re.findall('\.(?:\w+)', s)
# ret = re.findall('\d+(?:\.[\w]+)?', s)
# print(ret)

# Python中分组可帮您精确找到您真正所需内容
# <(\w+)>(\w+)</(\w+)>
# s = '<html>bb<head>aa<title>测试标题</title></head><body>33</body></html>'
# ret = re.findall('<(\w+)>(\w+)</(\w+)>' ,s)
# print(ret)

# split
#注意:正则表达式加()分组,保留分割后的元素同时也保留匹配元素
# ret = re.split('\d+', 'ropon8luo68peng282peng')
# # ret = re.split('(\d+)', 'ropon8luo68peng282peng')
# print(ret)

#Python与正则特殊约定
# 分组命名 自定义名称
# (?P<组的名字>正则表达式)
# 后向引用
# (?P=组的名字)

# s = '<a>wa21haha</a>'
# ret = re.search('(?P<con>\d+)',s)
# print(ret.group(1))
# print(ret.group('con'))

# s = '<a>wahaha</a>'
# pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'
# ret = re.search(pattern, s)
# print(ret.group())
# print(ret.group(1))
# print(ret.group(2))
# print(ret.group(3))
# print(ret.group(1) == ret.group(3))

# s = '<a>wahaha</a>'
# pattern = '<(?P<tab>\w+)>(\w+)</(?P=tab)>'
# ret = re.search(pattern, s)
# print(ret.group(2))

# time模块
import time

# 常用方法
# 延时,单位秒
# time.sleep(secs)

# time.sleep(3)
# print("test")

# 获取当前时间戳
# time.time()

# a = time.time()
# print(a)

# Python中三种方式表示时间:时间戳、元组、格式化时间字符串
# 1、时间戳:返回的float类型
# print(type(time.time()))
# 2、格式化时间字符串
# %y 2位数年份 18
# %Y 4位数年份 2018
# %m 月份 10
# %d 月中某天 12
# %H 小时[24小时制] 16
# %I 小时[12小时制] 04
# %M 分钟 05
# %S 秒 23
# %a 本地简化星期名称 Fri
# %A 本地完整星期名称 Friday
# %b 本地简化月份名称 Oct
# %B 本地完整完整名称 October
# %c 本地相应的日期和时间表示 Fri Oct 12 16:06:40 2018
# %j 年内的一天 285
# %p 本地AM或PM PM
# %U 一年中的星期数,星期天为星期的开始 40
# %w 星期(0-6),星期天为星期的开始 5
# %W 一年中的星期数,星期一为星期的开始 41
# %x 本地相应日期表示 10/12/18
# %X 本地相应时间表示 16:08:31
# %Z 当前时区名称
# %% %号本身

# 2018-10-12
# print(time.strftime("%Y-%m-%d"))
# 2018.10.12
# print(time.strftime("%Y.%m.%d"))
# 2018 10 12
# print(time.strftime("%Y %m %d"))
# 15:57:27
# print(time.strftime("%X"))

# 3、元组 struct_time元组共有9个元素 年,月,日时,分,秒,一年中第几周,一年中第几天,

# 总结:时间戳是计算机能识别的时间;时间字符串是人能看懂的时间;元组是用来操作时间的

Python之内置函数二

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/11 9:01
# @Author : Ropon
# @File : 15_01.py

# lambda #匿名函数
# 为了解决简单需求而设计一句话函数
# 比如计算n的n次幂
# def func(n):
# return n**n
# print(func(2))
#
# f = lambda n: n**n
# print(f(2))
# 语法:函数名 = lambda 参数: 返回值
# 1、函数的参数可以多个,多个参数用逗号隔开
# 2、匿名函数不管复杂程度,只能写一行,且逻辑结束后直接返回数据
# 3、返回值和正常函数一样,可以是任意数据类型
# 匿名函数并不是说一定没有名字,前面的变量就是函数名,说他是匿名函数是因为通过__name__查看没有名字,所以统称为lambda

# sorted() #排序函数
# 语法:sorted(iterable, key=None, reverse=False)
# iterable:可迭代对象
# key:排序规则或排序函数,在sorted内部会将可迭代对象中每一个元素传给这个函数的参数,根据函数运算结果进行排序
# reversed:是否倒序,True:倒序,False:正序

# lst = [7, 3, 2, 5, 4]
# lst1 = sorted(lst)
# print(lst)
# print(lst1)

# dic = {1: 'A', 2: 'B'}
# print(sorted(dic)) #字典排序,返回排序后的key

# def func(s):
# return len(s)
#
# lst = ["测试", "再次测试", "字符长度是多少", "我"]
# print(sorted(lst, key=func))
# print(sorted(lst, key=lambda s: len(s)))

# lst = [{"id": 1, "name": 'ropon', "age": 20},
# {"id": 2, "name": 'luo', "age": 16},
# {"id": 3, "name": 'peng', "age": 18}]
# print(sorted(lst, key=lambda e: e['age'], reverse=True)) #按年龄排序

# filter() #筛选函数
# 语法:filter(function ,iterable)
# function:用来筛选的函数,在filter中会自动将iterable对象中元素传递给function
# 然后根据function返回的True或False判断是否保留此项数据
# iterable:可迭代对象
#返回迭代器

# lst = [1, 2, 3, 4, 5, 6, 7, 8]
# ll = filter(lambda x: x%2==0, lst)
# print(list(ll))

# lst = [{"id": 1, "name": 'ropon', "age": 20},
# {"id": 2, "name": 'luo', "age": 16},
# {"id": 3, "name": 'peng', "age": 18}]
#
# ll = filter(lambda e: e['age'] > 16, lst) #筛选年龄大于16
# print(list(ll))

# map() #映射函数
# 语法:map(function ,iterable)
# function:对可迭代对象每一个元素进行映射,分别取出来执行function
# iterable:可迭代对象
#返回迭代器

# def func(e):
# return e*e
#
# mp = map(func, [1, 2, 3, 4, 5])
# print(mp)
# print(list(mp))

# print(list(map(lambda x: x * x, [1, 2, 3, 4, 5])))

# 计算2个列表相同位置的值之和
# lst1 = [1, 2, 3, 4, 5]
# lst2 = [2, 4, 6, 8, 10]
# print(list(map(lambda x, y: x + y, lst1, lst2)))

# 递归
# 在函数中调用函数本身,就是递归。

# 一直输出hello world
# 在python中递归最大深度为998
# def func():
# print("hello world")
# func()
# func()

# def func(n):
# print(n)
# n += 1
# func(n)
# func(1)

#递归应用
# 一般使用递归遍历各种树形结构,比如文件系统

# import os
#
# def readdir(filepath, n):
# files = os.listdir(filepath) #获取当前文件夹中所有文件及文件夹
# for fi in files: #遍历本层所有文件夹及文件
# # print(fi)
# fi_d = os.path.join(filepath, fi) #以/拼接路径
# if os.path.isdir(fi_d): #如果是文件夹,就输出,递归编译文件夹,否则结束递归,输出文件
# print("\t"*n, fi_d)
# readdir(fi_d, n+1)
# else:
# print("\t"*n, fi_d)
#
# readdir("D:\Ropon\Seafile\Work\python\code" , 0)

# 二分查找
# 每次查找都能排查一半的数据,效率高,但局限性大,必须是有序的序列才能使用二分查找

#判断n是否在lst列表中,若在返回其位置
#非递归算法,使用二分查找
# lst = [22, 33, 44, 55, 66, 77, 88, 99, 345, 444, 567, 789, 555]
# n = 567
# left = 0
# right = len(lst) - 1
# count = 1
# while left <= right:
# middle = (left + right) // 2
# if n < lst[middle]:
# right = middle - 1
# elif n > lst[middle]:
# left = middle + 1
# else:
# print(count)
# print(middle)
# break
# count += 1
# else:
# print("不存在")

# lst = [22, 33, 44, 55, 66, 77, 88, 99, 345, 444, 567, 789, 555]

#递归二分法
# def binary_search(n, left, right):
# if left <= right:
# middle = (left + right) // 2
# if n < lst[middle]:
# right = middle - 1
# elif n > lst[middle]:
# left = middle + 1
# else:
# return middle
# return binary_search(n, left, right)
# else:
# return -1
#
# print(binary_search(567, 0, len(lst) - 1))

Python之内置函数一

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/9 15:59
# @Author : Ropon
# @File : 14_01.py

#内置函数

#作用域
# locals()
# globals()

#迭代器相关
# range()
# next() #调用内部封装__next()__
# iter() #调用内部封装__iter()__

#字符串类型代码执行
#eval()
# print(eval("2" + "2"))
# print(eval("2 + 2"))

#执行字符串类型的代码
#exec()
# exec("""
# for i in range(5):
# print(i)
# """)

#将字符串类型代码变异,代码对象能通过exec执行或通过eval进行求值
# code1 = "for i in range(10): print(i)"
# c1 = compile(code1, "", mode="exec")
# exec(c1)

# code2 = "1+2+3"
# c2 = compile(code2, "", mode="eval")
# a = eval(c2)
# print(a)

# code3 = "name = input('请输入您的名字:')"
# c3 = compile(code3, "", mode="single")
# exec(c3)
# print(name)

#总结:有返回值字符串形式代码使用eval,没有返回值的字符串形式代码用exec,很少使用compile

#输入输出有关
#input()
#print()

#内存相关
# hash() #获取int,str,bool,tuple对象的哈希值
# id() #获取对象的内存地址

#文件操作相关
#open()

#模块相关
# __import__() #用于动态加载类和函数

#帮助
# help()

#调用相关
# callable() #检查对象是否可调用,返回True,对象有可能调用失败,但如果返回False,那调用肯定不成功

#查看对象内置属性
# dir() #查看对象内置属性,方法;访问的是对象中__dir__()方法

#基础数据类型相关
#数字相关
# bool() #将给的数据转换为bool值,不给值返回False
# int() #将给的数据转换为int值,不给值返回0
# float() #将给的数据转换为float值,不给值返回0.0
# complex()#创建一个复数,第一个参数为实部,第二个参数为虚部;或者第一个参数直接用字符串来描述复数
#complex(1, 1)
#complex("1+1j")
# a = complex("1-2j")
# print(a.real)
# print(a.imag)

#进制转换
# bin() #将给的值转换成二进制
# oct() #将给的值转换成八进制
# hex() #将给的值转换成十进制
# a = 15
# print(bin(a))
# print(oct(a))
# print(hex(a))

#数学运算
# abs() #返回绝对值
# divmod(x, y) #表示x/3 返回商和余数
# round() #四舍五入
# pow(x, y, [z]) #[]表示可选,求x的y次幂,如果有第三个参数,求完幂后再对第三个数取余
# sum() #求和 参数可迭代对象,如列表、元组、集合
# min() #求最小值
# max() #同理求最大值
# a = 7
# print(abs(a))
# print(divmod(a, 3))
# print(round(4.3))
# print(pow(2, 4, 3))
# print(sum((3, 2)))
# print(sum([1, 2, 3]))
# print(min(1, 2, -1))
# print(min([4, 5, -1]))
# print(max([4, 5, -1]))

#数据结构相关
#列表和元祖
# list() #将可迭代对象转换为列表
# tuple() #将可迭代对象转换为元组
# reversed() #将一个序列翻转,返回翻转序列的迭代器
# slice() #列表切片
# ret = reversed([1, 3, 5, 7, 9])
# print(ret.__next__())
# a = [11, 22, 33, 44]
# s = slice(1, 3) #11,33
# print(a[s])

#字符串相关
# str() #将数据转换为字符串
# format() #与具体数据有关,用于计算各种小数,精算等
#字符串
# print(format('test', '<20')) #左对齐
# print(format('test', '>20')) #右对齐
# print(format('test', '^20')) #居中

#数值
# print(format(3, 'b')) #转换为二进制
# print(format(97, 'c')) #转换Unicode编码
# print(format(11, 'd')) #转换为十进制
# print(format(11, 'n')) #转换为十进制
# print(format(121)) #以十进制输出
# print(format(11, 'o')) #转换为八进制
# print(format(11, 'x')) #转换为十六进制(小写字母)
# print(format(11, 'X')) #转换为十六进制(大写字母)

#浮点数
# print(format(123456789, 'e')) #科学计数法,默认保留6位小数
# print(format(123456789, '0.2e')) #科学计数法,保留2位小数(小写)
# print(format(123456789, '0.2E')) #科学计数法,保留2位小数(大写)
# print(format(123456789, 'f')) #小数点计数法,默认保留6位小数
# print(format(123456789, '0.2f')) #小数点计数法,保留2位小数
# print(format(123456789, '0.10f')) #小数点计数法,保留10位小数
# print(format(123456789, 'F')) #小数点计数法,默认保留6位小数

# bytes() #把字符串转换为bytes类型
# s = "测试"
# bs = s.encode("UTF-8")
# print(bs)
# s1 = bs.decode("UTF-8")
# print(s1)
# bs = bytes(s, encoding="UTF-8")
# print(bs)

# bytearray() #返回一个新字节数组,这个数组元素是可变的,而且每个元素的取值范围是[0, 256]
# ret = bytearray('ropon', encoding='UTF-8')
# for i in range(len(ret)):
# print(ret[i])

# memoryview() #查看bytes在内存中的情况
# s = memoryview("再次测试".encode("UTF-8"))
# a = '5'
# s1 = memoryview(a.encode("UTF-8"))
# print(s)
# print(s1)

# ord() #返回字符编码
# chr() #返回对应编码的字符
# ascii() #在ASCII编码中就返回该值,不在就返回Unicode
# print(ord('a'))
# print(ord('中'))
# print(chr(98))
# print(ascii('a'))
# print(ascii('我们'))

# repr() #返回一个对象的string形式
# print(repr('哈喽,\n \t 我是Ropon'))
# print('哈喽,\n \t 我是Ropon')

#数据集合
# dict() #创建一个字典
# set() #创建一个集合
# frozenset() #创建一个冻结的集合,冻结的集合不能进行添加或者删除

# 其他相关
# len() #返回对象中元素的个数
# sorted() #对可迭代的对象进行排序,配合lambda
# enumerate() #获取集合的枚举对象
# a = {'cpu', 'mem', 'os', 'os_size', 'data_size'}
# ret =enumerate(a)
# print(ret.__next__())
# print(ret.__next__())

# lst = ["cpu", "mem", "os"]
# for index, el in enumerate(lst):
# print(str(index)+"==>"+el)
#all() #可迭代对象中全部为True,结果才问True
#any() #可迭代对象中有一个为True,结果就是True
#zip() #将可迭代对象作为参数,将对象中对应的元素打包成一个个元组
# l1 = [1, 2, 3, ]
# l2 = ['a', 'b', 'c', 5]
# l3 = ('*', '**', (1, 2 ,3))
# for i in zip(l1, l2, l3):
# print(i)
#filter() #过滤,配合lambda
#map() #根据提供的函数对指定序列做映射,配合lambda

Python 之列表生产式,生成器表达式

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/10/8 15:38
# @Author : Ropon
# @File : 13_01.py

# def func1():
# print("11")
# # return 22
# # return,yield区别:yield是分段执行一个函数,return是直接停止执行函数。
# yield 22
#
# ret =func1()
# # print(ret)
# ret1 = ret.__next__()
# print(ret1)

# def func1():
# print("11")
# yield 22
# print("33")
# yield 44
#
# ret = func1()

# ret1 = ret.__next__()
# print(ret1)
# ret2 = ret.__next__()
# print(ret2)
# ret3 = ret.__next__()
# print(ret3)

# while 1:
# try:
# ret1 = ret.__next__()
# print(ret1)
# except StopIteration:
# break

# s = "测试字符串"
# print(dir(s)) #打印对象中的方法和函数
# print(dir(str)) #打印类中的方法核实函数

# lst = ["1", "2", "3"]
# # print(dir(lst))
# # print(lst.__iter__())
# ret = lst.__iter__()
# ret1 = ret.__next__()
# print(ret1)

# def yifu():
# for i in range(1, 10000):
# yield "衣服"+str(i)
#
# yf = yifu()
# print(yf.__next__())
# print(yf.__next__())
# print(yf.__next__())
# print(yf.__next__())
# print(yf.__next__())

# def eat():
# print("chi shen me:")
# a = yield "mantou"
# print("a=", a)
# b = yield "baozi"
# print("b=", b)
# # c = yield "huajuan"
# # print("c=", c)
#
# ret = eat()
# ret1 = ret.__next__()
# print(ret1)
#
# ret2 = ret.send("ropon")
# print(ret2)
#
# ret3 = ret.send("peng")
# print(ret3)
#
# ret4 = ret.send("luo")
# print(ret4)


#send和__next__区别:
#1、都是让生成器向下走一次
#2、sed可以给上一个yield的位置传递值,但不能给最后一个yield传值,第一次执行生成器也不能使用send


#列表推导式
#常用写法:
#[结果 for 变量 in 可迭代对象]
#筛选模式
#[结果 for 变量 in 可迭代对象 if 条件]

# lst = [i for i in range(1, 100) if i % 2 == 0]
# print(lst)

#生成器表达式和列表推导式语法一样,只是将[]换成()
# gen = (i for i in range(1, 10))
# print(gen)
# ret = gen.__next__()
# print(ret)

# def func1():
# print(11)
# yield 22
#
# g = func1()
# g1 = (i for i in g)
# g2 = (i for i in g1)
#
# print(list(g))
# print(list(g1))
# print(list(g2))

#字典推导式
# dic = {'a': 1, 'b': 2}
# new_dic = {dic[key]: key for key in dic}
# print(new_dic)

#集合推导式
# lst = [1, 3, -1, 9, 8, -8]
# s = {abs(i) for i in lst} #abs返回其绝对值
# print(s)

#总结:推导式有,列表推导式、字典推导式、集合推导式,没有元组推导式
#生成器表达式:(结果 for 变量 in 可迭代对象 if 条件) 生成器表达式可直接获取其对象,对象可直接使用for循环,生成器具有惰性机制

def add(a, b):
return a + b

def test():
for r_i in range(4):
yield r_i

g = test()
#0 1 2 3

# g = (add(2, i) for i in g)

#g的值是
# (
# add(2, 0),
# add(2, 1),
# add(2, 2),
# add(2, 3)
# )

# g = (add(10, i) for i in g)

#g的值是
# (
# add(10, add(2, 0)),
# add(10, add(2, 1)),
# add(10, add(2, 2)),
# add(10, add(2, 3))
# )
#遍历生成器开始运算输出结果
# print(list(g))
#输出[12, 13, 14, 15]

# for n in [2, 10]:
# g = [add(n, i) for i in g] #列表生成式会一次性进行所有的运算
# 第一次循环n=2,i第一次循环0 相加结果2 3 4 5
# 第二次循环n=10,i第一次循环2 相加结果 12 13 14 15

# g = (add(n, i) for i in g) # 生成器表达式只有在被遍历时才会进行运算
#第一次循环n=2,i 从0 1 2 3循环,因生成器具有惰性机制,n并没有取对应值,只是指向对应内存地址,g的值是
# (
# add(n, 0),
# add(n, 1),
# add(n, 2),
# add(n, 3)
# )
#第二次循环n=10,i 从add(2, 0) add(2, 1) add(2, 2) add(2, 3)循环,同理,g的值是
# (
# add(n, add(n, 0)),
# add(n, add(n, 1)),
# add(n, add(n, 2)),
# add(n, add(n, 3))
# )
#for循环完,系统会释放n,释放之前n先取值,g的值是
# (
# add(10, add(10, 0)),
# add(10, add(10, 1)),
# add(10, add(10, 2)),
# add(10, add(10, 3))
# )
#遍历生成器开始运算输出结果
# print(list(g))
#输出[20, 21, 22, 23]

# n =2
# g = (add(n, i) for i in g)
# n = 10
# g = (add(n, i) for i in g)
# print(list(g))

#上次遗漏疑惑问题
# a = [1, 2]
# a[1] = a
#a[1]是a自己
#a=[1,a[1]]
# print(a[1])