巨蟒python全棧開發-第14天 內置函數2 遞歸 二分查找

一.今日內容總覽python

1.內置函數補充
repr() 顯示出字符串的官方表示形式
chr() arscii碼中的字,轉換成位置
ord() arscii碼中的位置,轉換成字
2.遞歸
本身調用本身
兩個口:遞歸的入口(參數) 和 出口(return)
屬性結構的遍歷

3.二分法
掐頭去尾取中間
查找效率很是高

二.今日內容大綱app

1.內置函數(2)函數

2.遞歸測試

3.二分查找ui

三.今日內容詳解spa

1.內置函數(2)code

(1)字符串強轉list或者tuple,注意這裏是迭代強轉orm

print(list("胡辣湯"))
print(tuple("胡辣湯"))
'''
結果:
['胡', '辣', '湯']
('胡', '辣', '湯')
'''

(2)reversed()blog

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(""))  # 20013
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]) # 78

 

(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) # 78
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
存在
請輸入你要找的數據
相關文章
相關標籤/搜索