一.今日内容总览

1.内置函数补充
repr() 显示出字符串的官方表示形式
chr() arscii码中的字,转换成位置
ord() arscii码中的位置,转换成字
2.递归
自己调用自己
两个口:递归的入口(参数) 和 出口(return)
属性结构的遍历 3.二分法
掐头去尾取中间
查找效率非常高

二.今日内容大纲

1.内置函数(2)

2.递归

3.二分查找

三.今日内容详解

1.内置函数(2)

(1)字符串强转list或者tuple,注意这里是迭代强转

print(list("胡辣汤"))
print(tuple("胡辣汤"))
'''
结果:
['胡', '辣', '汤']
('胡', '辣', '汤')
'''

(2)reversed()

lst = ["河南话", "四川话", "东北", "山东", "上海"]
r = reversed(lst)
print(dir(r))    #证明这个函数是生成器
print(list(r)) # 结果:['上海', '山东', '东北', '四川话', '河南话']

(3)

huiwen = "上2自来水来自海上" #加上2的目的是为了测试
s = huiwen[::-1]
print(s)
# 结果: 上海自来水来自海上 it = reversed(huiwen) # 返回的是迭代器
print(it)
#结果: <reversed object at 0x000002E1CA867208> s = ""
for el in it:
s += el
print(s)
#结果:上海自来水来自海上 #结果:
#上海自来水来自2上
#<reversed object at 0x00000172783A74E0>
#上海自来水来自2上

(4)slice

lst = ["河南话", "四川话", "东北", "山东", "上海"]
s = slice(3,5) # 切片. 麻烦
print(lst[s]) #结果:['山东', '上海']
s = slice(3,) # 切片. 麻烦
print(lst[s])
#结果:['河南话', '四川话', '东北'] s = slice(3,4) # 切片. 麻烦
print(lst[s])
#结果:['山东']

(5)

格式化输出中的f和format
s = "我叫{name}, 我来自{home}, 我喜欢干{hobby}".format(name="周杰伦", home="台湾", hobby="唱歌")
print(s)
name = "周杰伦"
home="台湾"
hobby="唱歌"
print(f"我叫{name}, 我来自{home}, 我喜欢干{hobby}")

(6)

center()

s = "门神"
s1 = s.center(20)
print(s1)
'''结果: 门神 '''

(7)

print(format("门神", "^20"))    #门神在中间
print(format("门神", "<20")) #门神在左边
print(format("门神", ">20")) #门神在右边
'''结果: 门神 '''
'''结果:门神 '''
'''结果: 门神'''

(8)

print(format(3, 'b'))  # ⼆二进制  binary  0b11
print(format(65, 'c')) # 转换成unicode字符 ascii
print(format(11, 'o')) # ⼋八进制 0o 13
print(format(11, 'x')) # ⼗六进制(⼩写字⺟)
print(format(11, 'X')) # ⼗六进制(⼤写字⺟) print(format(11, 'd')) # ⼗十进制
print(format(11, 'n')) # 和d⼀样
print(format(11)) # 和d⼀样 '''
结果:
11
A
13
b
B
11
11
11
'''

(9)

print(format(123456789, 'e')) # 科学计数法. 默认保留6位小数  表示大的数据
print(format(123456789, '.2e')) # 科学计数法. 保留2位小数(e⼩写)
print(format(123456789, '0.2E')) # 科学计数法. 保留2位⼩数(E⼤写)
'''
结果:
1.234568e+08
1.23e+08
1.23E+08
'''
# 浮点计数法
print(format(1.23456789, 'f')) # 浮点数计数法. 保留6位⼩数
print(format(1.23456789, '0.2f')) # ⼩浮点数计数法. 保留2位⼩数
print(format(1, '0.10f')) # ⼩浮点数计数法. 保留10位⼩数
print(format(1.23456789e+10000, 'F')) # ⼩浮点数计数法.
'''
结果:
1.234568
1.23
1.0000000000
INF #无穷大的意思
'''

(10)

a = 0b11 # 数字3
print(type(a))
print(a)
'''
结果:
<class 'int'>
3
'''
print(ord("中")) #
print(chr(20014))
'''
结果:
20013

'''
for i in range(65536):
print(chr(i), end= " ")
#结果:循环打印出65536个字,不一定全显示,可能只显示一部分

(11)

print(ascii("a")) # 判断出你给的信息是否是ascii
print(ascii("冬瓜"))
#结果:
#'a'
#'\u51ac\u74dc'

(12)

# 转义字符
# \n 换行
# \t tab 制表符
# \r 回车
# \" 双引号
# \' 单引号
# \\ \
print('你好, 我叫周杰伦.我来自\\n台湾. 我老婆叫昆凌') # repr() # 还原字符串最官方的效果
# str:python的字符串
# repr: 所有的字符串 #注意:在这里repr和r的作用是一样的,但是原理是不一样的
print(repr("你好. \\n我叫\周杰伦")) # python -> repr() -> cpython c里面. 报错
#
print(r"\n\t范德萨发生\r\b\ffdsaf") # 原封不动的显示字符串

2.递归

(1)

#函数就是自己调用自己
def func():
print('我是地瓜')
func()
func() #官方最大1000,你永远跑不到1000,我实测998

(2)

while 1:
print("我不是递归")

(3)

#二叉树:完全二叉树
'''
病毒:(不要试)
f=open(path,mode='wb')
f.write(b'1')
'''
#树形结构的遍历

(3-1)

import os
def func(lujing,n): #'d:/a/'
lst=os.listdir(lujing) #打开文件夹,列出该文件夹内的所有文件名
for el in lst: #el是文件的名字,b,c
#还原路径
path=os.path.join(lujing,el) #"d:/a/b"
if os.path.isdir(path): #判断路径是否是目录
print('...'*n,el) #显示文件夹的名字
func(path,n+1) #再来一次
else:
print('...'*n,el) #显示文件
func('D:/a',0)

(3-2)

import os
def func(lujing,n): #'d:/a/'
lst=os.listdir(lujing) #打开文件夹,列出该文件夹内的所有文件名
# print(lst) #最初用来测试的,['b', 'c', '大冬瓜.txt']
for el in lst: #el是文件的名字,b,c
#还原路径
path=os.path.join(lujing,el) #"d:/a/b"
if os.path.isfile(path): #判断路径是否是文件(注意,这里的文件不只是文件夹,还有txt等)
print('...' * n, el) # 显示文件
else:
print('...' * n, el) # 显示文件夹的名字
func(path, n + 1) # 再来一次
func('D:/a',0)

总结:注意上边的红字区别,还有上边注释的理解,反复理解

3.二分查找

(1)

#二分法查找主要的作用就是查找元素
lst=[1,3,5,7,12,36,68,79]
num=int(input('请输入你要查找的元素信息:'))
for el in lst:
if num==el:
print('存在')
break
else:
print('不存在')
len(lst)
#对于计算机,很少的数是无所谓的,但是数以百万&亿计的,就真的有所谓了

(2)

规则,掐头去尾取中间
0 1 2 3 4 5 6 7
lst=[1,3,5,7,12,36,68,79]
n=28
规则,掐头结尾取中间,必须是有序序列 100000000//1亿最多是需要27次比较

(3)
(3-1)

二分法查找 (需要明白和掌握)
lst = [1,3,5,7,12,36,68,79]
n = int(input("请输入一个数"))
left = 0
right = len(lst) - 1
count=0
while left <= right:
mid = (left + right)//2
if n > lst[mid]:
left = mid + 1
elif n < lst[mid]:
right = mid - 1
else:
print("存在")
print(count)
break
count+=1
else:
print("不存在")
print(count)

(3-2)

递归另类想法
def func(n, lst):
left = 0
right = len(lst) - 1
if lst != []:
mid = (left + right)//2
if n > lst[mid]:
func(n, lst[mid+1:]) # 改变列表
elif n < lst[mid]:
func(n, lst[:mid]) #在这里列表取不到最后一个,所以不用减1
else:
print("找到了")
return
else:
print("没找到")
return
n = int(input("请输入你要查找的数:"))
func(n, [1,3,5,7,12,36,68,79]) #

(3-3)

递归2(需要明白和掌握)
def func(n, lst, left, right): # 递归找到什么是可以变的. 什么是不可以变的
if left <= right:
mid = (left + right) // 2
if n > lst[mid]:
left = mid + 1
return func(n, lst, left, right)
elif n < lst[mid]:
right = mid - 1
return func(n, lst, left, right) # 递归如果有返回值. 所有调用递归的地方必须写return
else:
print("找到了")
return mid # 难点
else:
print("找不到")
return -1 #比较牛掰的想法,找不到返回-1
n = int(input("请输入你要查找的数:"))
lst = [1,3,55,98,37,41,2,5,1,4]
ret = func(n, lst, 0, len(lst)-1) #
print(ret)

(4)

哈希寻找消耗内存,二分法不是最快的,只有这种是最快的
最快的查找方式
lst = [1,3,55,98,37,41,2,5,1,4]
print(max(lst)) new_lst = []
for i in range(99):
new_lst.append(0) for i in lst: # 1,3,55,98
new_lst[i] = 1
print(new_lst) while 1:
i = int(input('请输入你要找的数据'))
if new_lst[i] == 0: # 1次
print("不存在")
else:
print("存在")

结果:

98
[0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1]
请输入你要找的数据98
存在
请输入你要找的数据

巨蟒python全栈开发-第14天 内置函数2 递归 二分查找的更多相关文章

  1. 巨蟒python全栈开发-第13天 内置函数 匿名函数lambda

    一.今日内容总览 1.内置函数(1):并不是每一个内置函数都是那么常用 上菜:内置函数部分//思维导图:https://www.processon.com/view/link/5b4ee15be4b0 ...

  2. 巨蟒python全栈开发-第22天 内置常用模块1

    一.今日主要内容 1.简单了解模块 你写的每一个py文件都是一个模块 数据结构(队列,栈(重点)) 还有一些我们一直在使用的模块 buildins 内置模块.print,input random 主要 ...

  3. 巨蟒python全栈开发-第23天 内置常用模块2

    一.今日主要内容 1.nametuple:(命名元组,本质还是元组) 命名元组=>类似创建了一个类 结构化时间其实是个命名元组 2.os 主要是针对操作系统的 一般用来操作文件系统 os.mak ...

  4. 巨蟒python全栈开发-第24天 内置常用模块3

    一. 1.re模块基础知识 2.python模块&re正则模块 3.实战:re模块&python(链家&电影天堂&豆瓣) 复习:上节课重点(1)sys.path 模块的 ...

  5. python 全栈开发,Day51(常用内置对象,函数,伪数组 arguments,关于DOM的事件操作,DOM介绍)

    昨日内容回顾 1.三种引入方式 1.行内js <div onclick = 'add(3,4)'></div> //声明一个函数 function add(a,b){ } 2. ...

  6. Python全栈开发之4、内置函数、文件操作和递归

    转载请注明出处http://www.cnblogs.com/Wxtrkbc/p/5476760.html 一.内置函数 Python的内置函数有许多,下面的这张图全部列举出来了,然后我会把一些常用的拿 ...

  7. 巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式&&onblur和onfocus事件&&window.onload解释&&小米商城讲解

    1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...

  8. 巨蟒python全栈开发-第10天 函数进阶

    一.今日主要内容总览(重点) 1.动态传参(重点) *,** *: 形参:聚合 位置参数*=>元组 关键字**=>字典 实参:打散 列表,字符串,元组=>* 字典=>** 形参 ...

  9. 巨蟒python全栈开发-第19天 核能来袭-反射

    一.今日主要内容 1.isinstance,type,issubclass A.isinstance: 判断你给对象是否是xx类型的. (向上判断) B.type: 返回xxx对象的数据类型 C.is ...

随机推荐

  1. 设置右上角的菜单button

    效果如图: 刚開始是单独做了个button.发现无法调margin,后来想到外面套一个布局 <?xml version="1.0" encoding="utf-8& ...

  2. STM32关总中断的语句

    __set_PRIMASK();//关总中断 /************ **********/ __set_PRIMASK();//开总中断

  3. FreeSWITCH技巧:如何向通话的另一方号码发送dtmf?

    注:这里的文章都是本人的日常总结,请尊重下个人的劳动成果,转载的童鞋请注明出处,谢谢. 如您转载的文章发生格式错乱等问题而影响阅读,可与本人联系,无偿提供本文的markdown源代码. 联系邮箱:ji ...

  4. unity, 不要试图用rigidbody.Sleep()停止rigidbody

    如果想让rigidbody pause,用rigidbody.Sleep()是完全错误的办法.因为有很多情况都可能使一个处在sleep的rigidbody唤醒,所以调用rigidbody.Sleep( ...

  5. Wpf 抽屉效果

    在android开发中有抽屉效果,就是在页面的边上有一个按钮,可以通过点击或者拖拽这个按钮,让页面显示.Wpf也可以实现相同的效果. 主要是通过一个DoubleAnimation和RectAnimat ...

  6. 我的Android进阶之旅------&gt;Android关于Activity管理的一个简单封装

    怎样管理当前的执行Activity栈,怎样彻底退出程序.本文封装了一个Activity管理类,能够方便随时退出程序. import java.util.Stack; import android.ap ...

  7. vsftp 虚拟用户高级设置(转载)

    发布:xiaokk   来源:net     [大 中 小] vsftp 虚拟用户高级设置  本文转自:http://www.jbxue.com/article/1724.html 1.安装所需软件包 ...

  8. atitit.jQuery Validate验证框架详解与ati Validate 设计新特性

    atitit.jQuery Validate验证框架详解与ati Validate 设计新特性 1. AtiValidate的目标1 2. 默的认校验规则1 2.1. 使用方式 1.metadata用 ...

  9. redis源码学习_简单动态字符串

    SDS相比传统C语言的字符串有以下好处: (1)空间预分配和惰性释放,这就可以减少内存重新分配的次数 (2)O(1)的时间复杂度获取字符串的长度 (3)二进制安全 主要总结一下sds.c和sds.h中 ...

  10. CCNA2.0笔记_EIGRP

    EIGRP特征: •高级距离矢量路由协议 •快速收敛——路由条目不过期,拥有备份路由 •负载均衡 •无类路由 -支持 VLSM 和不连续子网,可关闭自动汇总(建议关闭) •占用带宽小 -触发更新(当拓 ...