zoukankan      html  css  js  c++  java
  • 17 Python之递归和二分法

    一 内置函数

      1. revserd 翻转,返回的是迭代器

    # 将 s 倒置
    s = '不是上海自来水来自海上'
    # 方法一
    print(s[::-1])
    # 方法二
    s1 = reversed(s)
    i = ''
    for el in s1:
      i +=el
      print(i)

      2.slice 切片

    lis = ['nishi','woshi','shuia','benjim']
    s = slice(1,3)
    print(lis[s])

      3.formate

    # 格式化输出
    s = "我叫{name},我想去{adress},我喜欢{hobby}.".format(name='zhangmeng',adress='上海',hobby='dance')
    print(s)
    
    
    # 字符串
    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')) # 小数点计数法.

      4. type() 返回类型    ord()  输入字符找字符编码的位置     chr()  输入位置找出对应的字符    ascii()判断给出的信息是否是ascii 

    for i in range(65536):
        print(chr(i), end="")

    二. 递归

      函数自己调用自己,递归的入口(参数)  和 出口(return)

    语法:

    def func():
        print('我是递归')
        func()
    
    func() # 官方显示最多到1000.但不会跑到1000,实际到998
    # 树形结构的遍历
    
    import os
    def func(lujing, n):
        lis = os.listdir(lujing) # 打开文件夹,列出文件夹内的所有文件名
        for el in lis: # el 为文件的名字
        # 还原文件路径
        path = os.path.join(lujing,el)
        if os.path.isdir(path):# 判断路径是否是文件夹
            print('*' * n,el) # 显示文件夹的名字
            func(path, n+1) # 再来一次
        else:
            print('/t'*n,el) # 显示文件
    
    func('f:/a', 0)
    import os
    def func(lujing, n):
        lis = os.listdir(lujing ) # 打开文件夹,列出文件夹内的所有文件名
        for el in lis: # el为文件名
    # 还原文件的路径
        path = os.path.join(lujing, el)
        if os.path.isdir(path): # 判断路径是否是文件夹
            print('*'* n, el) # 显示文件夹名称
            func(path, n+1) # 再来一次
        else:
            with open(path,mode='wb') as f: # 打开文件,都写入内容
                f.write(b'123456')
                  print('/t'*n, el) # 显示文件
    func('F:/a',0)

    三. 二分法

      掐头结尾取中间,查找效率非常高,二分法查找的主要作用就是查找元素
    # 二分法查找
    lst = [1,4,6,7,9,21,23,45,67,87,65,43,89]
    n = int(input('请输入一个数:'))
    lst = sorted(lst)
    # print(lst)
    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 = 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('请输入你要查找的数:'))
    lst = [1,4,6,7,9,21,23,45,67,87,65,43,89]
    
    
    func(n,lst)
    # 递归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)
                else:
                    print('找到了')
                    return mid # 难点
        else:
            print('找不到')
            return -1
    
    n = int(input('请输入你要查找的数:'))
    lst = [13,45,56,67,78,57,89,101]
    ret = func(n,lst,0,len(lst)-1)
    print(ret)
    # 最快的查找方法
    
    lst = [13,45,56,57,67,78,89,101]
    
    # 找出最大的数
    new_lst = []
    for i in range(99):
        new_lst.append(0)
    
    for i in lst:
        new_lst[i] = 1
    
    i = int(input('请输入你要找的数据:'))
    if new_lst[i] == 0:
        print('不存在')
    else:
        print('存在')
  • 相关阅读:
    司法相关学习网站视频资料
    小型网站如何防范DDoS攻击
    教你9招 破解多种系统登陆密码方法 (1)
    加快Win7整体运行速度的12个小技巧
    手机指令大全,需要可以看看
    Java、fileless恶意软件威胁桌面安全
    浅谈Android手机木马手工查杀
    Win7路由器设置过程
    如何加强移动应用开发安全?
    FTP常用故障代码注解
  • 原文地址:https://www.cnblogs.com/a2534786642/p/10116506.html
Copyright © 2011-2022 走看看