函数__内置函数(reversed,slice,format,ord,chr,ascii,repr)递归,迭代,二分法
一.内置函数.
1)reversed() 反转.返回值是个迭代器,打出来需要用list()一下
huiwen = "不是上海自来水来自海上"
s = huiwen[::-1]
it = reversed(huiwen) # 返回的是迭代器
s = ""
for el in it: #这样使用拼接的方法,打出来就是一个字符串了.好看
s += el
print(s)
输出结果为:上海自来水来自海上是不
第二种.是迭代打出来的,不咋好看
huiwen = "不是上海自来水来自海上"
s = huiwen[::-1]
it = reversed(huiwen) # 返回的是迭代器
print(list(s))
输出结果为:
['上', '海', '自', '来', '水', '来', '自', '海', '上', '是', '不']
2)slice() 切片,不常用
lst = ["河南话", "四川话", "东北", "山东", "上海"] s = slice(3,5) # 切片. 麻烦 print(lst[s]) 输出结果: ['山东', '上海']
3)format() 格式化输出.该函数可不限参数个数,位置可以不按顺序.
语法:"{}{}".format("参数1","参数2") "{} {}".format("hello", "world") # 不设置指定位置,按默认顺序 输出结果为:'hello world' "{0} {1}".format("hello", "world") # 设置指定位置 输出结果为:'hello world' "{1} {0} {1}".format("hello", "world") # 设置指定位置 输出结果为:'world hello world'
3.1)format() 数字格式化,不常用
print(format("门神", "^20")) #长度20,居中 print(format("门神", "<20")) #长度20,居左 print(format("门神", ">20")) #长度20,居右
3.2)format() 浮点数
print(format(123456789, 'e')) # 科学计数法. 默认保留6位小数 print(format(123456789, '0.2e')) # 科学计数法. 保留2位小数(小写) print(format(123456789, '0.2E')) # 科学计数法. 保留2位小数(大写) print(format(1.23456789, 'f')) # 小数点计数法. 保留6位小数 print(format(1.23456789, '0.2f')) # 小数点计数法.保留了原数字小数点后两位,这个比较好用 print(format(1.23456789, '0.10f')) # 小数点计数法. 保留10位小数 print(format(1.23456789e+10000, 'F')) # 小数点计数法
输出结果为:
1.234568e+08
1.23e+08 #此处的"08"意思是1.23被缩小了10**8,e表示科学记数法
1.23E+08
1.234568
1.23 #保留了原来数字的小数点后两位,这个比较好用,直接,明显.
1.2345678900
INF #超界限了,打印不出来,就显示该数为无限
4)ord() 拿字找位置(索引值),返回的是该字符在编码的位置.对应的是unicode码
chr() 拿数找字,返回的是该数在码里面的字,对应的是unicode码,中国字65536个数字位置
5)ascii() 判断是否在ascii码里,在就打印出该参数在ascii里的码区码位.
print(ascii("饕髢")) 输出结果为: '\u9955\u9ae2'
6)repr() 将字符串还原为底层C语言认识的合理语法.(python是C语言写的)
\n 换行 \t tab 制表符 \r 回车 \" 双引号 \' 单引号 \\ \转义
print('你好, 我叫周杰伦.我来自\\n台湾. 我老婆叫昆凌') repr() # 还原字符串最官方的效果 print(repr("你好. \\n我叫\周杰伦")) # python接收到内容 交给 repr()翻译,之后交给 cpython,处理完之后才能显示出来 题外话:如何原封不动的显示字符串内容,就在这个字符串前面加个r print(r"\n\t范德萨发生\r\b\ffdsaf") # 原封不动的显示字符串
name = "xiaoli"
print(f"我叫{name},我来自地球") #这里的f是格式化输出的意思,如果是fr就是就是两者的混合体
打印结果:
我叫xiaoli,我来自地球
二.递归.
函数自己调用自己
def func(): print("我是递归") func() func() # 递归,官方显示最大为1000次,你永远跑不到1000, 我实测998
下面介绍下用函数递归打印出所有的文间目录
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("\t" * n,el) # 显示文件 func("d:/a", 0)
新词解析:
os.path 模块主要用于获取文件的属性。 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表,此列表以字母排序,它不包括 '.' 和'..' 即使它在文件夹中。 os.path.join() #把目录和文件名合成一个路径,说白了,就是做拼接的,给出绝对路径 os.path.isdir(path) 判断路径是否为目录(就是文件夹),需提供绝对路径 os.path.isfile(path) 判断路径是否为文件(文件是某种执行格式),需提供绝对路径 目录文件”指的是某些“文件”,“目录”只是定义这些文件存放的位置。文件是有具体内容或用途的,通常电脑有多种不同功用的文件,有可执行文件,数据文件,类或库文件,文本文件,图像文件等等
os.path.join()方法.创建以用户名为txt文件名的例子
import os 例子1: dirs = "C:\\register作业" #根目录文件夹名字 if not os.path.exists(dirs): #如果改目录下not(没有此文件夹),就可以执行这个if os.makedirs(dirs) #创建文件夹 例子2: lst = os.listdir(dirs)#把此目录下的所有文件或文件夹名字放进一个列表 dirs = "C:\\register作业" #此处为根目录 tiwen2=input("输入注册账号:") name=tiwen2+".txt" #以用户名为文件的名字,进行拼接 name1 = os.path.join(dirs,name) #拼接出绝对目径 f = open(name1,mode="a",encoding="utf-8") #创建指定目录下的文件,且文件名为用户输入的账户 f.write(tiwen3) #写入用户输入的密码. f.close() return
三、二分法.
特点:掐头去尾取中间,查找效率很高,但是局限性比较大,必须是有序序列才可以用此方法
二分法查找 (需要你明白和掌握) lst = [1,3,5,7,12,36,68,79] n = int(input("请输入一个数")) left = 0 right = len(lst) - 1 while left <= right: mid = (left + right)//2 if n > lst[mid]: left = mid + 1 elif n < lst[mid]: right = mid - 1 else: print("存在") break else: print("不存在")
第二种(需要理解掌握)
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
第三种(了解下即可)
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]) else: print("找到了") return else: print("没找到") return n = int(input("请输入你要查找的数:")) func(n, [1,3,5,7,12,36,68,79]) # 78
最快的查找(了解即可) 此方法最节省空间和时间的.先创建一个最大值的列表,全部为0,把存在的数据当作这个列表的下标,把对应的小标改成1,最后,用户查找的时候,以输入的值为这个列表的下标,如果该下标对应的值为1,说明存在,否则不存在
lst = [1,3,55,98,37,41,2,5,1,4] new_lst = [] for i in range(99): new_lst.append(0) for i in lst: new_lst[i] = 1 print(new_lst) i = int(input("输入你要找的数据:")) if new_lst[i]==0: print("不存在") else: print("存在")