函数__内置函数(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("存在")

 

posted @ 2018-12-13 22:34  Tank-Li  阅读(373)  评论(0编辑  收藏  举报