第五天,感觉开始烧脑了。递归逻辑难,模块数量多,但是绝世武功都是十年磨一剑出来的!稳住!

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修炼第五天的更多相关文章

  1. python修炼第一天

    Python修炼第一天 新的开始:不会Python的运维,人生是不完整的. 为了我的人生能够完整,所以我来了!今后跟着太白金星师傅学习功夫,记录一下心得,以便日后苦练. 一 Python的历史: Py ...

  2. 初学 Python(十五)——装饰器

    初学 Python(十五)--装饰器 初学 Python,主要整理一些学习到的知识点,这次是生成器. #-*- coding:utf-8 -*- import functools def curren ...

  3. Python第十五天 datetime模块 time模块 thread模块 threading模块 Queue队列模块 multiprocessing模块 paramiko模块 fabric模块

    Python第十五天  datetime模块 time模块   thread模块  threading模块  Queue队列模块  multiprocessing模块  paramiko模块  fab ...

  4. python学习第五次笔记

    python学习第五次笔记 列表的缺点 1.列表可以存储大量的数据类型,但是如果数据量大的话,他的查询速度比较慢. 2.列表只能按照顺序存储,数据与数据之间关联性不强 数据类型划分 数据类型:可变数据 ...

  5. Python学习第五堂课

    Python学习第五堂课推荐电影:华尔街之狼 被拯救的姜哥 阿甘正传 辛德勒的名单 肖申克的救赎 上帝之城 焦土之城 绝美之城 #上节内容: 变量 if else 注释 # ""& ...

  6. Python爬虫进阶五之多线程的用法

    前言 我们之前写的爬虫都是单个线程的?这怎么够?一旦一个地方卡到不动了,那不就永远等待下去了?为此我们可以使用多线程或者多进程来处理. 首先声明一点! 多线程和多进程是不一样的!一个是 thread ...

  7. Python爬虫实战五之模拟登录淘宝并获取所有订单

    经过多次尝试,模拟登录淘宝终于成功了,实在是不容易,淘宝的登录加密和验证太复杂了,煞费苦心,在此写出来和大家一起分享,希望大家支持. 温馨提示 更新时间,2016-02-01,现在淘宝换成了滑块验证了 ...

  8. Python爬虫入门五之URLError异常处理

    大家好,本节在这里主要说的是URLError还有HTTPError,以及对它们的一些处理. 1.URLError 首先解释下URLError可能产生的原因: 网络无连接,即本机无法上网 连接不到特定的 ...

  9. 孤荷凌寒自学python第二十五天初识python的time模块

    孤荷凌寒自学python第二十五天python的time模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 通过对time模块添加引用,就可以使用python的time模块来进行相关的时间操 ...

随机推荐

  1. JZ2440学习笔记之链接文件lds

    如果在Linux环境下用arm-linux-gcc来编译arm程序,需要编写链接文件lds: 1. 运行地址=链接地址,表示代码在SDRAM中执行的地址,如果程序中有对某部分代码执行过搬运,需要在ld ...

  2. 7步快速解决SQLServer数据库(2008版)重装问题

    最近遇到了鼠标双击启动不了数据库的问题,根据事件管理器和自己的最近的使用情况初步判断估计是自己在用360误伤了数据库(哭) 没有办法只好重新安装一下了,参考了网上的一些大神们的教程然后自己实战操作一下 ...

  3. 关于Hibernate 连接mysql不能自动建表的问题

    最近看旧书,李刚那本<轻量级J2EE>在讲解hibernate的时候遇到一个问题,就是与mysql连接后,明明配置了自动建表,却老是建不了表,上网查了发现是方言的原因,到底什么是方言?这里 ...

  4. iOS __block 关键字的底层实现原理 -- 堆栈地址的变更

    默认情况下,在block中访问的外部变量是复制过去的.但是可以加上 __block  来让其写操作生效. 原理: Block 不允许修改外部变量的值,这里所说的外部变量的值,指的是栈中指针的内存地址. ...

  5. JS getBoundingClientRect()

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  6. MongoDB 索引 explain 分析查询速度

    一.索引基础索引是对数据库表中一列或多列的值进行排序的一种结构,可以让我们查询数据库变得更快.MongoDB 的索引几乎与传统的关系型数据库一模一样,这其中也包括一些基本的查询优化技巧.下面是创建索引 ...

  7. 【HNOI 2018】毒瘤

    Problem Description 从前有一名毒瘤. 毒瘤最近发现了量产毒瘤题的奥秘.考虑如下类型的数据结构题:给出一个数组,要求支持若干种奇奇怪怪的修改操作(例如给一个区间内的数同时加上 \(c ...

  8. h5 ios键盘卡死页面

    失去焦点以后重新设置页面顶部位置 $('input,textarea').on('blur',function(){ window.scroll(0,0); }); $('select').on('c ...

  9. 使用VSCode调试Jest

    0. 环境 Node版本:8.12.0 操作系统:windows10 1. 配置launch.json { "version": "0.2.0", " ...

  10. C#异常重试通用类Retry

    //Retry机制 public static class Retry { /// <summary> /// 重试零个参数无返回值的方法 /// </summary> /// ...