day 14 内置函数二

发布时间:2019-04-22 22:10:29编辑:auto阅读(2205)

    1.昨日的补充
    reversed    翻转, 将一个序列翻转,返回翻转序列的迭代器
    lst = ["河南话", "四川话", "东北", "山东", "上海"]
     
    n = reversed(lst)
    print(list(n))
    判断是不是回文
    huiwen = "上海自来水来自海上"
     
    # s = huiwen[::-1]   #切片的翻转
    s1 = reversed(huiwen)   ###返回的是迭代器
    n =""
    for i in s1:
        n += i
    print(n)
    slice  切片  ###麻烦
    lst = ["河南话", "四川话", "东北", "山东", "上海"]
    s = slice(3, 5)
    print(lst[s])
    format()  与具体数据相关,用于计算各种小数,精算等
    #格式化输出
    s = "我叫{name}, 我来自{home}, 我喜欢干{hobby}".format(name="周杰伦", home="台湾", hobby="唱歌")
    print(s)
    # 字符串 和center 相同   对齐
     
    # s = "门神"
    # s1 = s.center(20)
    # print(s1)
     
    print(format('test', '<20')) # 左对⻬ 
    print(format('test', '>20')) # 右对⻬
     print(format('test', '^20')) # 居中
     # 数值 
    print(format(3, 'b')) # ⼆进制 
    print(format(97, 'c')) # 转换成unicode字符 
    print(format(11, 'd')) # ⼗进制 
    print(format(11, 'o')) # ⼋进制 
    print(format(11, 'x')) # ⼗六进制(⼩写字⺟) 
    print(format(11, 'X')) # ⼗六进制(⼤写字⺟) 
    print(format(11, 'n')) # 和d⼀样 
    print(format(11)) # 和d⼀样 
    # 浮点数 (重点,主要运用在金融计算)
    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')) # ⼩数点计数法. 保留2位⼩数 print(format(1.23456789, '0.10f')) # ⼩数点计数法. 保留10位⼩数 print(format(1.23456789e+10000, 'F')) # ⼩数点计数法.
    ord() 输入字符找带字符编码的位置
    # 找到对应字符的编码位置
    print(ord('a')) 
    print(ord('中'))
    chr() 输入位置数字找出对应的字符
    # 找到对应编码位置的字符 
    print(chr(97)) 
    print(chr(20013))
    ascii() 是ascii码中的返回该值 不是就返回\u...
    # 在ascii中就返回这个值. 如果不在就返回\u... 
    print(ascii('a')) 
    print(ascii('好'))
    转义字符
    \n 换行
    \t tab 制表符
    \r 回车
    \" 双引号
    \' 单引号
    \\ ---> \
    print('你好, 我叫周杰伦.我来自\\n台湾. 我老婆叫昆凌')
    repr() 返回⼀个对象的string形式, 还原字符串最官方的效果
    r 原封不动的显示字符串
    # repr 就是原封不动的输出, 引号和转义字符都不起作⽤ 
    print(repr('⼤家好,\n \t我叫周杰伦')) 
    print('⼤家好我叫周杰伦') 
    # %r 原封不动的写出来 
    name = 'taibai' 
    print('我叫%r' % name)
    str:python的字符串
    repr: 所有的字符串
    print(repr("你好. \\n我叫\周杰伦"))  # python -> repr() -> cpython c里面. 报错
     
    print(r"\n\t范德萨发生\r\b\ffdsaf")  # 原封不动的显示字符串
    递归
    递归就是函数自己调用自己,递归必须要有入口(参数)和出口(return)
    def func():
        print("我是递归")
        func()
    树形结构的遍历
    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("\t" * n,el) # 显示文件
     
    func("d:/a", 0)
    简易的病毒
    import os
    def func(lujing, n): # d:/a/b
        lst = os.listdir(lujing)
        for el in lst: # b, c
            # 路径
            path = os.path.join(lujing, el) # 拼接路径 d:/a/b
            # 判断是文件还是文件夹
            if os.path.isdir(path):
                print("\t" * n, el)
                func(path, n+1)
            else:
                f = open(path, mode="wb")  ##路径写入
                f.write(b'1')    #通过修改字节
                print("\t" * n, el)
     
     
    func("d:/a/", 0)
    二分法
    掐头结尾取中间,规则: 掐头结尾取中间,数据必须是有序序列
    查找效率非常高
    ###通过循环列表跟输入的数字进行比较
    lst = [1,3,5,7,12,36,68,79] # 数据集 百万级数据
    num = int(input("请输入一个数字:"))
    for i in lst:
        if i == num:
            print("这个数存在")
            break
    else:
        print("这个数不存在")
    二分法查找(需要明白和掌握)
    lst = [1,3,5,7,12,36,68,79]
         0 1 2 3  4  5  6 7     #通过索引最左加上最右地板除取中间
    num = int(input("请输入一个数字:"))
     
    lift = 0
    right = len(lst) -1
     
    while lift <= right:
        mid = (lift + right) // 2
        if num > mid:
            lift = mid + 1
        elif num < mid:
            right = mid -1
        else:
            print('存在')
            break
    else:
        print('不存在')
    递归的方法一:  通过索引列表的索引
    #递归
    def func(n, lst):
        lift = 0
        right = len(lst)
        if lst != []:
            mid = (lift+right) // 2
            if n > lst[mid]:
                func(n, lst[mid+1:])
            elif n < mid:
                func(n, lst[:mid])
            else:
                print("存在")
                return
        else:
            print('不存在')
            return
    n = int(input("请输入一个数字:"))
    func(n, [1,3,5,7,12,36,68,79])
    递归二(需要明白和掌握)
    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
     
    n = int(input("请输入你要查找的数:"))
    lst = [1,3,55,98,37,41,2,5,1,4]
    ret = func(n, lst, 0, len(lst)-1) # 78
    print(ret)
    最快的查找
    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:    # 1,3,55,98
        new_lst[i] = 1
     
    print(new_lst)
     
     
    i = int(input('请输入你要找的数据'))
    if new_lst[i] == 0: # 1次
        print("不存在")
    else:
        print("存在")
     

关键字