python修炼第五天
第五天,感觉开始烧脑了。递归逻辑难,模块数量多,但是绝世武功都是十年磨一剑出来的!稳住!
1 递归。
定义-----递归就是在函数的内部调用自己
递归深度 998
不建议修改递归深度,因为如果998都没有解决,那么这个功能就不适合用递归写
例子:
猜年龄
alex多大,alex比wusir大两岁 40+2+2
wusit多大,wusir比金老板大两岁 40+2
金老板多大了,40了
def age(n)
if n == 3:
return 40
else:
return age(n+1)+2
age(1)
递归求解二分查找算法:
99*99 可以 99*100-99 就是9900 - 99 = 9801
这个属于人类的算法。
计算机的算法是 计算一些比较复杂的问题,所采用的 在空间上,或者时间上
更有优势的方法
空间就是节省内存。时间是执行时间计算速度更快 比如排序50000万个数找到最小的与最大的,一般是快速排序,堆排序,冒泡排序
查找功能使用算法
二分法: 只能查找有序的数字集合的查找问题
l = [2,3,4,5,6,7,8,9,0,11,22,23,24,27,33,37,44,46,55,59,66,67,77,74,88,90,92,98]
def cal(num=66):
length - len(l)
mid = length//2
if num > l[mid]:
l = l[mid:] def cal(l,num,start,end)
if start < = end
mid = (end - start)//2 +start
if l[mid] > num:
return cal(l,num,start,mid-1)
elif l[mid] < num:
return cal(l,num,mid+1,end)
else:
print("找到了",mid,l[mid])
else:
return " 没找到"
2 常用模块1 模块定义:模块就是py文件,模块是写好了但不直接使用的功能。
2 模块的意义(摘抄):
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用, 3 模块的分类:
常用的 和某个操作相关的 根据相关性分为三类:内置模块。扩展模块。自定义模块
内置模块
安装了Python解析器后就一起提供了这些模块,一般是特别常用的
扩展模块
需要自己下载安装的模块
pypi网站:
www.pypi.org
自定义模块
自己写的模块 4 内置模块:
一 collections模块
orderedDict
提供了很多其他的数据结构,比如有序字典orderedDict
d = collections.OrderedDict() counter
计算某一个字符串出现的次数 defaultdict
from collections import defaultdict
l = [11,22,33,44,55,66,77,88]
my_dict = defaultdict(list)
默认这个字典的value是一个空列表
print(my_dict["a"])
my_dict["b"] = 10
print(my_dict)
如果新创建了key 并指定了值,那么就按照你指定的值赋值,就不是默认列表了 namedtuple
创建一个元祖,但是里面的元素都用一个名字代表。
生成可以使用名字来访问元素内容的tuple deque
双端队列,可以快速的从另外一侧追加和推出对象 二 时间模块
定义:时间模块通常有三种方式来表示时间:时间戳、格式化的时间字符串、元组(struct_time)
1。时间戳时间:表示的是从1970年1月1日00:00:00开始按秒计算的偏移量
print(time.time()) 2.格式化时间:
time.strftime("%Y-%m-%d %H:%M:%S")
还有%x %c等常用的格式。
格式化时间字符串(摘抄):
%y 两位数的年份表示(00-99)
%Y 四位数的年份表示(000-9999)
%m 月份(01-12)
%d 月内中的一天(0-31)
%H 24小时制小时数(0-23)
%I 12小时制小时数(01-12)
%M 分钟数(00=59)
%S 秒(00-59)
%a 本地简化星期名称
%A 本地完整星期名称
%b 本地简化的月份名称
%B 本地完整的月份名称
%c 本地相应的日期表示和时间表示
%j 年内的一天(001-366)
%p 本地A.M.或P.M.的等价符
%U 一年中的星期数(00-53)星期天为星期的开始
%w 星期(0-6),星期天为星期的开始
%W 一年中的星期数(00-53)星期一为星期的开始
%x 本地相应的日期表示
%X 本地相应的时间表示
%Z 当前时区的名称
%% %号本身
3.元组时间(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)
print(time.localtime())
t = time.localtime()
格式(摘抄)
索引(Index) | 属性(Attribute) | 值(Values) |
---|---|---|
0 | tm_year(年) | 比如2011 |
1 | tm_mon(月) | 1 - 12 |
2 | tm_mday(日) | 1 - 31 |
3 | tm_hour(时) | 0 - 23 |
4 | tm_min(分) | 0 - 59 |
5 | tm_sec(秒) | 0 - 60 |
6 | tm_wday(weekday) | 0 - 6(0表示周一) |
7 | tm_yday(一年中的第几天) | 1 - 366 |
8 | tm_isdst(是否是夏令时) | 默认为0 |
4.时间的转换:
可以接收一个时间戳时间变成本地化的时间
print(time.localtime(1550000000))
格式化时间转字符串时间
stryct_time = time_gmtime(20000000000)
print(time.strftime("%Y-%m-%d %H:%M:%S",stryct_time))
格式化时间转时间戳时间
s = "1988-12-22 9:23:22"
ret = time.strptime(s,"%Y-%m-%d %H:%M:%S",stryct_time")
print(ret)
print(time.rmktime(ret))
练习题:
1 拿到当前时间的月初1号的0点的时间戳时间。
2 计算任意 两个时间点之间经过了多少年月日时分秒
datetime是根据time模块再次封装的模块 更上层 三 random模块
随机小数
random.random() 大于0且小于1之间的小数
random.uniform(1,3) 大于1小于3的小数
练习:
发红包 随机整数
random.randint(0,9) 取一到二
练习:
验证码
s = ""
for i in range(4):
s += rangom.randint(0,9)
print(s)
字母与数字都有:
id = ""
num = random.randint(65,90)
c = chr(num)
num2 = random.randint(0,9)
print(num2)
s = random.choice([c,num2])
print(s)
for i in range(4):
id += s
print(ss)
随机选择一个返回
随机选择多个返回,返回的个数为函数的第二个参数 四 os模块
系统相关模块
文件操作:
删除文件
os.remove()
重命名文件
os.rename("old","new")
目录操作:
os.makedirs("dir1/dir2") 多层递归创建目录
os.removedirs("dir1") 若目录为空则删除,并递归到上一级目录。如果也为空则删除。以此类推
os.mkdir("dir1") 生成单级目录
os.rmdir("dir1") 删除单级空目录 目录不为空则无法删除。
os.listdir("dir1") 列出指定目录下的所有文件和子目录。包括隐藏文件并以列表方式打印
当前工作目录有关操作:
os.getcwd() 获取当前工作目录。即当前python脚本工作的目录路径。
os.chdir("dir1") 改变当前脚本工作目录。相对于shell 的cd ,注意如果改变了路径 open 文件时候会在改变的路径下创建文件。
os.curdir() 返回当前目录:"."
os.pardir() 放回上一级目录:".."
stat 属性操作:
os.stat("dir/file")
st_mode inode保护模式
st_ino inode节点号
st_dev inode驻留设备
st_nlink inode的连接数
st_uid 所有者的用户ID
st_gid 所有者的组ID
st_size 普通文件以字节为单位大小,包含等待某些特殊文件的数据
st_atime 上次访问时间
st_mtime 上次修改元数据时间
st_ctime 上次修改文件内容数据的时间
操作系统差异:
os.sep 输出操作系特定的路径分隔符 win是\\ linux /
os.linesep 输出当前平台使用的行终止符 win是\t\n linux是\n
os.pathsep 输出用于分割文件路径的字符串 win ; linux :
"path1%spath2%s",%os.pathsep
os.name 输出字符串指示当前使用平台, win是 nt linux是posix
操作系统命令执行:
os.system 执行系统的命令,直接显示。
os.system("dir") 执行dir命令
os.popen 执行系统命令,返回返回值。
ret = os.popen("dir").read()
print(ret)
截屏 五 sys模块
Python解析器模块
sys.exit() 解释器退出,程序结束
sys.modules #放了所有在解释器运行过程中导入的模块名称。
sys.path 程序相关的路径。 一个模块能否导入需要看是否在这里sys.path列表里面存放的路径下面
sys.argv 在执行Python脚本的时候,可以传递一些参数进来
if sys.argv[1] == "alex" and sys.argv[2] == "alex3714":
print("可以执行下面的代码")
else:
print("密码错误退出")
sys.exit()
这个只能从命令行中执行并传入参数来使用 六 re正则表达式模块
功能比如简单的校验
正则表达式 字符串匹配相关的操作的时候用到的一种规则
正则表达式的规则
使用python中的re模块去操作正则表达式
在线测试工具
http://tool.chinaz.com/regex 正则表达式:
[] 匹配一个字符位置的字符
[0-9] 匹配0到9的字符
[a-z] 匹配a到z的字母
[A-Za-z] 匹配大小写字母
[0-9a-fA-F] 匹配一个十六进制字符 元字符:
. 匹配任意一个字符
\d 匹配任意一个数字
\w 匹配任意一个数字,字母,下划线
\s 匹配任意一个空白符
\n 匹配换行符
\t 匹配制表符
a\b 匹配单词结尾,这里是结尾是否是a
^a 匹配最开始 这里是匹配是a开头的字符
a$ 匹配结尾 这里是匹配a为结尾的字符 大写的就都是相反的
\W 就是匹配非数字,字母,下划线
[\w\W] 这是一种全组,可以匹配所有 ABC|ABCD 如果两个正则表达式先匹配到ABC那么就不往后匹配了,所以要先把长的写到前面
应该写为ABCD|ABC [^...] 如果在字符组中加^ 那么就是除了字符组的其他的都匹配[^ABC] 量词
{num} 约束出现几次,只约束紧挨着前面的
[1][3-9][0-9]{9} 就是可以匹配前面[0-9]字符组出现9次
量词跟在一个元字符的后面 约束某个字符的规则能够重复多少次
如果要匹配的字符刚好是和元字符一模一样,那么需要对这个元字符进行转义 \ * 重复零次或多次
+ 重复一次或多次
?重复0次或一次
{n} 匹配n次
{n,} 重复n次或多次
{n,m} 重复n次到m次 贪婪普配
正则表达式中的所有量词,都会尽量多的为你匹配
+表示匹配一次或多次
算法:回朔算法
练习:
匹配整数与小数
\d+(/.\d+)? 惰性匹配
? 如果在量词的后面 ?号就是惰性匹配
\d+?
\d{3,5}? 只匹配3次
?? 只匹配0次或一次 尽量少匹配
{n,}? 匹配n次或多次,尽量只配置n次
.*?x 匹配任意字符碰到一个x就停止 匹配身份证
^[1-9]\d{14}(\d{2}[0-9x])?$ re模块方法:
re.findall() 匹配全部符合条件的值,并全部返回
ret = re.findall("\d+","df12 dsfs23dd sdfs21")
print(ret) re.search() 找第一个符合条件的。同时返回的值是一个内存地址。需要group()调用
ret = re.search("\d+","df12 dsfs23dd sdfs21")
print(ret.group())
一般是
if ret:
print(ret.group()) re.match 在search基础上,给每一条都加上了^ 匹配开头
ret = re.match("\d+","df12 dsfs23dd sdfs21")
print(ret)
结果是空 re.split 匹配切割 re.sub 把数字替换成字符串 后面指定替换几次
ret = re.sub("\d","g","adfasdf2131sdfsdf",1) re.subn 吧数字替换成字符串 并返回元祖(替换的结果,替换了多少次) re.cap 不常用 注意:
findall 的优先级
如果匹配中有分组,那么只返回分组的匹配,所以需要在分组前加?:来取消分组优先级 作业:
字符串计算器,加减乘除小括号,使用正则
提示:先算小括号里面的
然后在算乘除,再算加减 三级菜单 递归 或堆栈
时间模块
红包
python修炼第五天的更多相关文章
- python修炼第一天
Python修炼第一天 新的开始:不会Python的运维,人生是不完整的. 为了我的人生能够完整,所以我来了!今后跟着太白金星师傅学习功夫,记录一下心得,以便日后苦练. 一 Python的历史: Py ...
- 初学 Python(十五)——装饰器
初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...
- Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块
Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fab ...
- python学习第五次笔记
python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...
- Python学习第五堂课
Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...
- Python爬虫进阶五之多线程的用法
前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread ...
- Python爬虫实战五之模拟登录淘宝并获取所有订单
经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...
- Python爬虫入门五之URLError异常处理
大家好,本节在这里主要说的是URLError还有HTTPError,以及对它们的一些处理. 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的 ...
- 孤荷凌寒自学python第二十五天初识python的time模块
孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...
随机推荐
- JZ2440学习笔记之链接文件lds
如果在Linux环境下用arm-linux-gcc来编译arm程序,需要编写链接文件lds: 1. 运行地址=链接地址,表示代码在SDRAM中执行的地址,如果程序中有对某部分代码执行过搬运,需要在ld ...
- 7步快速解决SQLServer数据库(2008版)重装问题
最近遇到了鼠标双击启动不了数据库的问题,根据事件管理器和自己的最近的使用情况初步判断估计是自己在用360误伤了数据库(哭) 没有办法只好重新安装一下了,参考了网上的一些大神们的教程然后自己实战操作一下 ...
- 关于Hibernate 连接mysql不能自动建表的问题
最近看旧书,李刚那本<轻量级J2EE>在讲解hibernate的时候遇到一个问题,就是与mysql连接后,明明配置了自动建表,却老是建不了表,上网查了发现是方言的原因,到底什么是方言?这里 ...
- iOS __block 关键字的底层实现原理 -- 堆栈地址的变更
默认情况下,在block中访问的外部变量是复制过去的.但是可以加上 __block 来让其写操作生效. 原理: Block 不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址. ...
- JS getBoundingClientRect()
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- MongoDB 索引 explain 分析查询速度
一.索引基础索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快.MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧.下面是创建索引 ...
- 【HNOI 2018】毒瘤
Problem Description 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的数据结构题:给出一个数组,要求支持若干种奇奇怪怪的修改操作(例如给一个区间内的数同时加上 \(c ...
- h5 ios键盘卡死页面
失去焦点以后重新设置页面顶部位置 $('input,textarea').on('blur',function(){ window.scroll(0,0); }); $('select').on('c ...
- 使用VSCode调试Jest
0. 环境 Node版本:8.12.0 操作系统:windows10 1. 配置launch.json { "version": "0.2.0", " ...
- C#异常重试通用类Retry
//Retry机制 public static class Retry { /// <summary> /// 重试零个参数无返回值的方法 /// </summary> /// ...