1. 程式人生 > >python心得與總結二

python心得與總結二

總結和複習二

我對這周學到的知識做一個全面的總結,這周的學習對我的影響非常大,函式,字串,類,列表等等都是非常重要的知識,由於我的思維能力較差所以對我來說這一塊比較難,但我會盡力去克服困難。通過這周的學習讓我明白了python這門語言的一些優勢與缺點,比如它的垃圾回收能力非常出色,但是它也有許多坑,例如在互動式環境中如果兩個變數等於一個數,那麼這兩個變數是同一個地址的數字區間在[-5,256],而在開發環境中這個區間變成0到無窮大,這種情況在java和C中不會出現。

函式

def is_palindrome(a):

    # 判斷一個字串是不是迴文字串
    """
    :param a: 一個字串

    :return: 是迴文字串就返回True否則返回False
    """
for b in range(len(a) // 2): if a[b] != a[len(a) - b - 1]: return False return True if __name__=='__main__': print(is_palindrome('adcda'))
def f(*args):#可變引數
    total = 0
    for val in args:
        total += val
    return total
​
mylist = [1,3,5,45,67,54]
print(f(*mylist))
​
####定義判斷質數的函式
from math import sqrt
def is_prime(num):
    for factor in range(2,int(sqrt(num))+1):
        if num%factor==0:
            return False
    return True if num!=1 else False
####as是在調入函式時的別名處理,讓函式名更簡單
import combination as ca
if __name__=='__main__':
    print(ca.gcd(15,27))
    print(ca.lcm(15
,27))

                #定義最大公約數的函式
def gcd(x,y):
    """
    計算兩個數的最大公約數

    :param x: 一個正整數
    :param y: 一個正整數

    :return: x和y的最大公約數
    """
    (x,y)=(y,x) if (x>y) else (x,y)
    for factor in range(x,0,-1):
        if x%factor==0 and y%factor==0:
            return factor
定義最小公倍數的函式

def lcm(x,y):
return x*y//gcd(x,y)

def add(x=0,y=0,z=0):
return x+y+z

引數預設值為0

print(add())
print(add(x=1,z=2,y=3))

函式的引數個數可以有0個或任意多個
#可變引數
def f(*args):
    total = 0
    for val in args:
        total += val
    return total
​
mylist = [1,3,5,45,67,54]
print(f(*mylist))
​
判斷一個數是不是迴文數
def  is_palindrome(num):
    """
    判斷一個數是不是迴文數
    :param num: 一個非負整數
    :return: 是迴文數返回True否則返回False
    """
    temp=num
    total=0
    while temp>0:
        total=total*10+temp%10
        temp//=10
    return num==total

if __name__=='__main__':
    number=int(input('請輸入一個非負整數:'))

and和or運算子都是帶短路功能的運算子
如果and左邊的表示式是False那麼右邊的表示式被短路(不執行)
如果or左邊的表示式是True那麼右邊的表示式被短路(不執行)
所以左右兩邊的表示式放置的順序可能會對執行效率產生明顯的影響

判斷是不是迴文質數
if is_prime(number) and is_palindrome(number):
    print('%d是迴文素數' %number)
else:
    print('%d不是迴文素數' %number)
駝峰命名法如下:
isPrime
ageOfStudent
variable:變數
constant:常量
#####人機拿火柴遊戲
from random import randint
match=21
while match>1:
    print('剩餘火柴數%d' %match)
    p=int(input('人拿的火柴數:'))
    if 1<=p<=4:
        match-=p
        print(match)
    j=5-p
    print('機器拿的火柴%d' %j)
    while True:
        match-=j
        break
print('人拿了最後一根,機器贏')
人跟機器都隨機拿的寫法:
from random import randint
match=21
while match>0:
    print('總共還有%d根火柴' %match)
    while True:
        num = int(input('人拿的火柴數:'))
        if 1<=num<=4 and num<=match:
            break
        else:
            print('請重新拿')
    match -= num
    if match>0:
        com = randint(1,min(4,match))
        print('計算機拿了%d根火柴' %com)
        match-=com
        if match == 0:
            print('計算機拿到最後一根火柴,你贏了!')
    else:
        print('你拿了最後一根火柴,你輸了!')

函式作用域

在函式外面定義的a是一個全域性變數(global variable)
python搜尋一個變數的方式是從區域性作用域到巢狀作用域再到全域性作用域再到內建
Local-Enclosed-Global-Built
如果想改變搜尋範圍 可以使用global和nonlocal關鍵字
我們在做開發時要減少使用全域性變數
迪米特法則:儘量減少與陌生的模組掛鉤
a = 100

def  foo():
    #local variable
    # 函式內的區域性變數  離開foo函式變數a是無法訪問的,如果要讓區域性變數使用全域性變數可以通過如下方法:
    #全域性變數可以在整個專案使用,函式內的變數不能在函式外使用,要想達到這個效果用global關鍵字
    global a
    a = 200
    b = 'hello'


    def bar():
        nonlocal b
        b = 'good'
        print(a)
        print(b)


    bar()
    print(b)


foo()
print(a)
# 在進入函式呼叫之前要儲存當前的執行現場
# 函式的執行現場是儲存在一種稱為棧(stack)的記憶體空間上
# 棧是一種先進後出(FILO)的儲存結構


函式的遞迴呼叫
1.收斂條件:讓遞迴在有限的次數內完成或者進行回溯
2.如果遞迴無法在有限的次數內收斂就有可能導致遞迴錯誤(RecursionError)
遞迴呼叫:一.個函式,呼叫了自身即是遞迴

三要素:
1.寫出臨界條件
2.返回上一級和下一級之間的關係
3.根據上一次計算出的結果求出本次計算的結果

def f(n):
    if n==0 or n==1:
        return 1
    return n*f(n-1)



def f(n):
    if n == 0:
        return 0
    return n+f(n-1)

if __name__ == '__main__':
    print(f(100))


def walk(n):
    if n<0:
        return 0
    elif n == 0:
        return 1
    return walk(n-1)+walk(n-2)+walk(n-3)

if __name__ == '__main__':
    print(walk(10))

#漢諾塔遊戲
def hanoi(n,a,b,c):
    if n>0:
        hanoi(n-1,a,c,b)
        print(a,'.....',b)
        hanoi(n-1,c,b,a)
遞迴解決螺旋矩陣問題
n = int(input('請輸入數字:'))
#初始化列表
list1 = [[0] * n for i in range(n)]
#遞迴解決
def fun(list1, x, y, start, n):
    if n<=0:return 0
    if n==1:
        list1[x][y] = start
        return 0
    #up
    for i in range(n):
        list1[x][y + i] = start
        start += 1
    #right
    for i in range(n-1):
        list1[x + 1 + i][y + n - 1] = start
        start += 1
    #down
    for i in range(n-1):
        list1[x + n - 1][y + n - 2 - i] = start
        start += 1
    #left
    for i in range(n-2):
        list1[x + n - 2 - i][y] = start
        start += 1
    fun(list1, x + 1, y + 1, start, n - 2)

a = fun(list1, 0, 0, 1, n)
#格式化輸出print
len1 = len(str(n*n))+1
str1 = ('%'+str(len1)+'d')*n
for tmp in list1:
    print (str1 %tuple(tmp))

n=5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9

遞迴目錄,搜尋出目錄下的全部檔案跟資料夾
import os
'''
getAllDir(path, str = '')
path: 檔案路徑
str: 路徑字串
'''
# 實現目錄的遍歷
def getAllDir(path, str = ''):
    # 返回一個指定資料夾(目錄)包含檔案和資料夾(目錄),並且返回一個列表,但是不包含.和..,他一般按照英文首字母排序
    fillAll = os.listdir(path)
    # print(fillAll)
    str += ' '
    for filename in fillAll:

        # 一定不能少了全路徑的拼接
        filePath = os.path.join(path, filename)
        # print(filePath)

        # 判斷filePath是否是目錄
        if os.path.isdir(filePath):
            print(str + '資料夾' + filename)
            # filePath是目錄
            getAllDir(filePath, str)
        else:
            # filePath不是目錄,即是檔案
            print(str + '檔案:' + filename)


getAllDir('..\day08')

使用棧模擬遞迴遍歷目錄
import os
def getALLDir(path):
    list1 = []
    list1.append(path)
    # print(list1)

    while len(list1) != 0:
        # 開始從列表中取資料
        dirPath = list1.pop()
        # print(dirPath)
        # 得到檔案下邊的所有檔案路徑
        filesAll = os.listdir(dirPath)

        # print(filesAll)

        for filename in filesAll:
            # 路徑拼接全路徑
            filePath = os.path.join(dirPath, filename)
            if os.path.isdir(filePath):
                # 是目錄
                list1.append(filePath)

            else:
                # 是檔案
                print('檔案' + filename)

getALLDir('../day08')
使用佇列模擬遞迴遍歷目錄
import os
import collections

def getAllDir(path):
    # 建立列表
    # 使用collections.deque方法可以建立一個兩端都可以操作的列表,也就是說我們可以在兩端進行新增和刪除
    que = collections.deque()
    que.append(path)
    # print(que)

    while len(que) != 0:
        # 得到檔案路徑
        dirPath = que.popleft()

        # 獲取該路徑下邊的檔案和資料夾
        filesPath = os.listdir(dirPath)

        for filename in filesPath:
            # 拼接全路徑
            filePath = os.path.join(dirPath, filename)

            if os.path.isdir(filePath):
                # 是目錄
                que.append(filePath)
            else:
                # 是檔案
                print('檔案' + filename)

getAllDir('../day08')

模組

在python中,每一個指令碼執行都會有一個__name__屬性
1.如果當前指令碼獨立執行,則其name屬性的值為__main__
2.如果當前指令碼引入模組,則模組中的names屬性值是當前模組名,而執行指令碼的name屬性值是__main__

####從不同模組調入同一個函式,則是後面的那一種生效。
####也可用下面這種兩種方式來規避。
####通過下面的if條件可以在匯入模組時不去執行下面的程式碼
if __name__=='__main__':
    from math import gcd
    print(gcd(2,3))
    from combination import gcd
    print(gcd(4, 6))
import math
import combination as ca #這裡的as是對複雜模組名稱的別名處理,讓它用起來更簡潔

from  day6 import is_prime
#####從模組匯入全部函式用*
from day6 import *

if __name__=='__main__':
    for n in range(1,101):
        if is_prime(n):
            print(n)
#我們可以把程式中相對獨立的功能模組抽取出來
#這樣做的好處是減少重複程式碼的編寫
#將來可以重複的使用這些功能模組
#python中的函式就是代表了這樣的功能模組
#y=f(x) f是函式名 x是自變數 y是因變數
定義函式的括號內可以有1個或多個引數
定義函式時自變數也可以有預設值
定義求階乘的函式,將求階乘的功能抽取出來放到函式中
當需要計算階乘的時候不用在寫迴圈而是直接呼叫已經定義好的函式

os模組

#獲取當前的工作目錄
# 獲取的是絕對路徑
# print(os.getcwd())

# 在windows下,寫路徑儘量寫成/
# print(os.listdir('C:/Users/劉海豔/Desktop/day09'))
# 直接報錯,不能傳遞檔案路徑
# print(os.listdir('C:/Users/劉海豔/Desktop/day09/1-os模組.py'))


# 在當前目錄下建立新的目錄
# os.mkdir('C:/Users/劉海豔/Desktop/day09/lhy')
# os.mkdir('./goods')


# 刪除目錄, 只能刪除空目錄
# os.rmdir('goods')


# 對檔案進行重新命名
# os.rename('goods', 'bad')


# 獲取檔案的屬性

# print(os.stat('1-os模組.py'))


# 刪除檔案
# os.remove('./bad/hello.py')
# os.remove('test.txt')

# 路徑拼接

path1 = 'C:/Users/劉海豔/Desktop/day09/'
path2 = '/lhy'
# 注意:在引數二處儘量不要寫/
# print(os.path.join(path1, path2))

# 拆分路徑
# print(os.path.split('C:/Users/劉海豔/Desktop/day09'))
# # print(os.path.split('C:/Users/劉海豔/Desktop/day09/1-os模組.py'))


# 拆分檔案的副檔名
path1 = 'C:/Users/劉海豔/Desktop/day09/1-os模組.py'
# print(os.path.splitext(path1))

# 判斷是否是目錄,是返回True  否返回False
# print(os.path.isdir(path1))

# 判斷目錄存在不存在
# print(os.path.exists(path1))

# 判斷s是否是檔案
# print(os.path.isfile(path1))

# 獲取檔案的大小
# print(os.path.getsize(path1))

# 獲取當前檔案的目錄
# print(os.path.dirname(path1))

# 獲取當前檔名
print(os.path.basename(path1))

時間模組

import time

# 時間戳 1970-1-1 00:00:00, 以浮點形式顯示
time1 = time.time()
# print(time1)

# 將時間戳轉換成UTC時間
time2 = time.gmtime(time1)
# print(time2)


# 將時間戳轉換成本地時間
time3 = time.localtime(time1)
# print(time3)


# 將時間格式轉換成時間戳 單位是S,  返回一個浮點數
time4 = time.mktime(time3)
# print(time4)

# 將時間格式轉換成使用者可讀的時間形式  ,並且返回的是一個字串
time5 = time.asctime(time3)
# print(time5)
# print(type(time5))

# 將時間戳轉換成使用者可讀的時間.
time6 = time.ctime(time1)
# print(time6)
# print(type(time6))

# 字串的格式化輸出,一般展示給你的親愛的使用者來看
time7 = time.strftime('%Y-%m-%d %X', time2)
time8 = time.strftime('%Y-%m-%d %X', time3)
# print(time7)
# print(time8)

# 將字串的時間格式轉換成元祖型別的時間格式
time9 = time.strptime(time7,'%Y-%m-%d %X')
print(time9)

datetime模組

import datetime


date1 = datetime.datetime.now()
# print(date1)
# print(type(date1))

# 獲取指定的時間
date2 = datetime.datetime(2028, 6, 6, 10, 23, 34, 234)
# print(date2)

date3 = date1.strftime('%Y-%m-%d %X') #格式化操作
# print(date3)


date4 = datetime.datetime.strptime(date3, '%Y-%m-%d %X') 將字串轉換成元組
print(date4)

日曆模組


# 獲取指定的月份
# print(calendar.month(2018, 5))

# 獲取指定的年份
# print(calendar.calendar(2018))
#

# 引數一返回上個月的最後一天對應的星期
# 引數二返回當月的天數
# print(calendar.monthrange(2018, 6))

# 返回一個二級列表, 並且每個單獨的二級列表是以周為單位
# print(calendar.monthcalendar(2018, 4))
文件註釋 點選Ctrl+Q鍵可以看到函式的解釋(如果是蘋果系統用Ctrl+J)
def  f(x):
    """
    :param x: x是非負整數
    :return: x的階乘
    """
      y=1
      for num in range(1,x+1):
          y*=num
      return y


if __name__=='__main__':
m=int(input('m='))
n=int(input('n='))
print(f(m)//f(n)//f(m-n))

字串

字串裡的元素不可改變,可以進行切片操作:

def main():
    str1 = 'hello,world!'
    # 通過len函式計算字串的長度
    print(len(str1))  12
    # 獲得字串首字母大寫的拷貝
    print(str1.capitalize())  # Hello, world!
    # 獲得字串變大寫後的拷貝
    print(str1.upper())  # HELLO, WORLD!
    # 從字串中查詢子串所在位置
    print(str1.find('or'))  # 7
    print(str1.find('shit'))  # -1
    # 與find類似但找不到子串時會引發異常
    # print(str1.index('or')) #7
    # print(str1.index('shit'))#報錯
    # 檢查字串是否以指定的字串開頭
    print(str1.startswith('He'))  # False
    print(str1.startswith('hel'))  # True
    # 檢查字串是否以指定的字串結尾
    print(str1.endswith('!'))  # True
    # 將字串以指定的寬度居中並在兩側填充指定的字元
    print(str1.center(50, '*'))
    # 將字串以指定的寬度靠右放置左側填充指定的字元
    print(str1.rjust(50, ' '))
    str2 = 'abc123456'
    # 從字串中取出指定位置的字元(下標運算)
    print(str2[2])  # c
    # 字串切片(從指定的開始索引到指定的結束索引)
    print(str2[2:5])  # c12
    print(str2[2:])  # c123456
    print(str2[2::2])  # c246
    print(str2[::2])  # ac246
    print(str2[::-1])  # 654321cba
    print(str2[-3:-1])  # 45
    print(str2[:] #abc123456
    print(str2[::] #abc123456
    print(str2[:-2] #abc1234
    print(str2[::-2]#642ca
    print(str2[:-6:-1])  #65432
    # 檢查字串是否由數字構成
    print(str2.isdigit())  # False
    # 檢查字串是否以字母構成
    print(str2.isalpha())  # False
    # 檢查字串是否以數字和字母構成
    print(str2.isalnum())  # True
    str3 = '  [email protected] '
    print(str3)
    # 獲得字串修剪左右兩側空格的拷貝
    print(str3.strip())
    #減掉左側空格
    print(str3.lstrip())
    #減掉右側空格
    print(str3.rstrip())
    str4=str3.replace('a','12',count=2)
    print(str4)  #'   [email protected] '
    replace有替換字元的作用
    swapcase()函式是將字串中的大寫轉小寫,小寫轉大寫



if __name__ == '__main__':
    main()
用os模組做清屏處理
import os
import time

def main():
    str1 = '歡迎來到成都千峰學習......'
    while True:
        os.system('cls')
        print(str1)
        time.sleep(0.2)
        str1 = str1[1:] + str1[0]


if __name__ == '__main__':
    main()
生成四位隨機驗證碼(可以是數字或大小寫字母)

from random import randint

def generate(check_num = 4):
    """

    :param check_num: check_num:驗證碼的長度
    :return: 由大小寫英文字母和數字構成的隨機驗證碼
    """

    temp = ''
    for i in range(check_num):  # check_num為需要迴圈的次數,也就是需要生成驗證碼的個數,預設值為4
        choice = randint(1, 3)  # 生成1到3的隨機數
        if choice == 1:  # 如果choice為1,則隨機驗證碼的值為數字
            temp +=str(randint(0,9))
        elif choice == 2:  # 如果choice為2,則隨機驗證碼的值為大寫字母
            num = randint(65, 90)
            temp += chr(num)
        elif choice == 3:  # 如果choice為3,則隨機驗證碼的值為小寫字母
            num = randint(97, 122)
            temp += chr(num)
    return temp

if __name__ == '__main__':
    for _ in range(10):
        print(generate())

取檔案的字尾名

def get_suffix(filename,has_dot = False):
    """

    :param filename: 檔名
    :param has_dot: 字尾名是否帶.
    :return: 檔案的字尾名
    """


    pos = filename.rfind('.')
    if 0 < pos < len(filename)-1 :
        index = pos if has_dot else pos+1
        return  filename[index:]
    else:
        return ''


if __name__ == '__main__':
    print(get_suffix('fdty.kdhd',True))

生成一個檔名


from random import randint

def main(x):
    temp = ''
    for _ in range(x):
        a = randint(1,3)
        if a == 1:
            temp += str(randint(0,9))
        elif a == 2:
            b = randint(65,90)
            temp += chr(b)
        elif a == 3:
            c = randint(97,122)
            temp += chr(c)

    return temp

if __name__ == '__main__':
    print(main(20))


列表

和字串一樣,列表也可以做切片操作,通過切片操作我們可以實現對列表的複製或者將列表中的一部分取出來創建出新的列表。
f = [100,200,500]
for index,val in enumerate(f): # 列舉函式enumerate
print(index,’:’,val)
# CRUD操作Create Read Update Delete
f.append(123) # append表示在末尾加一個數
f.insert(2,90) # insert表示在f[2]的位置插入90這個元素
if 50 in f:
f.remove(50) # 如果不知道位置用這種刪除
del f[3] # 如果知道位置用這種刪除
#f.clear() 清除列表元素
print(f.index(200)) #輸出200的下標
print(f.pop(1)) #刪除下標為1的元素
f2 = [1,2,3]
f3 = f2.extend([4,5,6])
print(f3) #[1,2,3,4,5,6]
f4 = f2.extend((3,4))
print(f4) #[1,2,3,3,4]
f5 = f2.extend({‘name’:’熊彪’,’age’:25})
print(f5) #[1,2,3,’name’,’age’]
f7 = f2.extend((True,False))
print(f7) #[1,2,3,True,False]
f6 = f2.extend(5)
print(f6) #報錯,extend裡面必須是一個容器,不能直接加數字

import sys
f = [x**2 for x in range(1,10)]
print(sys.getsizeof(f)) #輸出列表佔用的記憶體
print(f)
f = [x+y for x in 'ABCDE' for y in '1234567']
####列表的生成表示式語法建立列表容器
####已經準備就緒所以需要耗費較多的記憶體空間
f1 = (x**2 for x in range(1,10))
print(list(f1))
#### 列表生成器 這裡得到的不是一個列表 而是一個生成器物件
####通過生成器可以獲取到資料 它不佔用額外的空間儲存資料
####每次需要資料的時候就通過生成器獲取資料 當然這需要花費時間
####時間和空間是不可調和的矛盾
####軟體和硬體在邏輯上是等效的
from random import randint
def main():
    # 有了列表容器我們可以使用1個變數來儲存多個數據
    # 更為重要的是我們可以使用迴圈對列表中儲存的資料進行操作
    f = [0]*11
    for _ in range(60000):
        face = randint(2,12)
        f[face-2] += 1
    for index in range(len(f)):
        print('%d點搖出%d次' %(index+2,f[index]))

   # 直接通過for-in迴圈對列表(容器)進行遍歷
    for counter in f:
        print(counter)
if __name__ == '__main__':
    main()

除了上面提到的生成器語法,Python中還有另外一種定義生成器的方式,就是通過yield關鍵字將一個普通函式改造成生成器函式。下面的程式碼演示瞭如何實現一個生成斐波拉切數列的生成器。所謂斐波拉切數列可以通過下面遞迴的方法來進行定義:

斐波拉切數列

def main():
     f = [1,1]
     for index in range(2,20):
         val = f[index-1]+f[index-2]
         f.append(val)
     print(f)

 if __name__ == '__main__':
    main()


######生成器函式
def fib(n):
    a,b = 0,1
    for _ in range(n):
        a,b = b,a+b
        yield a

# f = fib(20)
# print(f)

for val in fib(20):
    print(val)
####python內建的排序方法預設都是排升序(從小到大)
#### 如果希望排列成降序(從大到小)可以通過把reverse引數賦為True來指定
####python中的函式幾乎都是沒有副作用的函式
#####呼叫函式之後不會影響傳入的引數

    f = [1,2,3,4,10,6,7,8,9]
    f2=sorted(f,reverse=True)  #複製了的一個新的列表,不會影響原來的列表
    print(f)
    print(f2)
    f3 = list(reversed(f))
    print(f3)
    print(f)


    f.sort(reverse=True)  #在原來列表的基礎上做由大到小的序列改變

    print(f)
    f3 =list( reversed(f)) #新建的一個列表做翻轉,沒有改變原列表
    print(f3)
    print(f)
    f4 = f3    #沒有複製新列表,只是引用了相同的物件
    import sys
    print(sys.getsizeof(f4))
    print(sys.getsizeof(f3))
    print(f3 is f4)    #True

    print(f3)
    print(max(f))
    print(min(f))
    print(float(sum(f)/len(f)))
def main():
    names = ['劉備','張飛','曹操','袁紹','關羽','趙雲','周瑜']
    s = []
    for name in names:
        score = input('請輸入%s的成績:' % name)
        s.append(score)
    print(s)
    # s1 = s.sort()
    s1 = sorted(s)
    print(s)
    print(s1)

    a = s.index(s1[6])
    print('得最高分的是:%s' %names[a])
    print(s1[6])
    # print(s1[6])

    # scores = [95, 78, 62, 99, 100, 65, 37]
    # min_score = max_score = scores[0]
    # total = 0
    # for score in scores:
    #     if score > max_score:
    #         max_score = score
    #     elif score < min_score:
    #         min_score = score
    #     total += score
    # print('最高分:', max_score)
    # print('最低分:', min_score)
    # print('平均分:%.1f' % (total / len(scores)))


if __name__ == '__main__':
    main()

f = [‘dysdyete’,’dcfetsgd’,’dfew’,’dfwyedyyefuydd’,’dewyyfe’]
f2 = sorted(f,key=len,reverse=True) #通過引入key關鍵字,指定列表中字串的長度來排序而不是預設的字母表順序
print(f2)

import sys
list1 = [0]*10
list2 = list1
list3 = list2
print(sys.getsizeof(list1))
print(sys.getrefcount(list1))
76
4

import sys
list1 = [0]*10
list2 = list1[:]
list3 = list2[:]
print(sys.getsizeof(list1)) #getsizeof是sys模組中輸出列表佔用的記憶體位元組大小的
print(sys.getrefcount(list1)) #getrefcount是sys模組中的用於計算物件的引用個數的
76
2

list = [x**2 for x in range(1,10)]
list = list+[20,30]
%timeit(1,2,3,4,5,3,2,1,1,3,4,4,5,)

21.7 ns ± 0.281 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

元組的執行效率比列表的要快得多

%timeit[1,2,3,4,5,3,2,1,1,3,4,4,5,]

179 ns ± 2.3 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
雙色球機選
from random import randint,sample,choices

def display(balls):
    for index,ball in enumerate(balls):#enumerate是列舉的作用
        if index == len(balls) - 1:
            print('|', end=' ')
        print('%02d' % ball, end=' ')
    print()

def random_select():
    red_balls = [x for x in range(1, 34)]
    selected_balls = []
    #第一種寫法:
    for _ in range(6):
        index = randint(0, len(red_balls) - 1)
        selected_balls.append(red_balls[index])
        del red_balls[index]
    #第二種寫法:
    selected_balls = sample(red_balls,6)#隨機取樣,無重複數字,所以也可以用這種
    #selects_balls = choices(red_balls,k = 6) 隨機取樣,有重複數字,所以這裡不能用這種方式
    selected_balls.sort()
    selected_balls.append(randint(1, 16))
    return selected_balls

def main():
    n = int(input('機選幾注: '))
    for _ in range(n):
        display(random_select())

if __name__ == '__main__':
    main()
取列表裡的第二大元素
def Second_large_num(x):
  # 文 檔 注 釋
    """

    :param num_list: 一個由數字組成的列表
    :return: 列表中的第二大元素
    """
#one是代表最大值的一個變數
#two是代表第二大值的變數
    (one,two) = (x[0],x[1]) if x[0] > x[1] else (x[1],x[0])
    for i in range(2, len(x)):
        if x[i] > one:
            two = one
            one = x[i]
        elif x[i] > two:
            two = x[i]
        else:
            pass
    return two


if __name__ == '__main__':
    num_list = [110, 34, 11, 23, 56, 78, 0, 99, 12, 3, 79, 5]
    print(Second_large_num(num_list))
約瑟夫環問題

def main():
    persons = [True]*30
    counter = 0
    index = 0
    number = 0
    while counter<15:
        if persons[index]:
            number += 1
            if number == 9:
                persons[index] = False
                counter +=1
                number = 0
        index +=1
        index %= 30
    for person in persons:
        print('基督徒' if person else '非基督徒',end = '')

if __name__ == '__main__':
    main()
雙重列表的實際應用

def main():
    names = ['關羽','張飛','趙雲','馬超','曹操']
    subjects = ['語文','數學','python']
    table = []
    for row,name in enumerate(names):
        print('請輸入%s的成績:' % name)
        scores = []
        for col,subject in enumerate(subjects):
            score = int(input(
            
           

相關推薦

python心得總結

總結和複習二 我對這周學到的知識做一個全面的總結,這周的學習對我的影響非常大,函式,字串,類,列表等等都是非常重要的知識,由於我的思維能力較差所以對我來說這一塊比較難,但我會盡力去克服困難。通過這周的學習讓我明白了python這門語言的一些優勢與缺點,比如它的

python爬蟲的心得總結

最近老闆讓搞python爬蟲,提取地圖中水庫位置。在開展下一段探索前,先記一些心得體會。 一、工欲善其事必先利其器 想要爬取網站上的資訊,必須有一個好的工具。firefox和chrome都有不錯的工具,用chrome比較多,主要講一下它的使用。喜歡探索細節的小夥伴移到下面

面試心得總結

程式設計師大部分時間都是在解決Bug,當我解決Bug時,總有一種隱隱的感覺,感覺我在尋找迷宮的入口。 我圍著迷宮一直轉圈,每轉一圈,對他越熟悉,越瞭解,就越接近入口。好比最近的非常火的美劇《西部世界》,機器人死千百次,每次都是重複,每次重複都不一樣,

python學習心得總結

本週主要學習了類和麵向物件的知識,學得容易,靈活運用卻很難,還需要多加練習孰能生巧。 函式 引數、預設值、可變引數、關鍵字引數、命名關鍵字引數 可變引數:*args 關鍵字引數:**kwargs 返回值 巢狀定義 高階函式、λ函式(匿名函式)、

VINS-Mono代碼分析總結() 系統初始化

exp 簡單 都是 最小值 cnblogs 特征向量 vision 還要 per VINS-Mono代碼註釋:https://github.com/gaochq/VINS-Mono/tree/comment 註釋不完整,可以一起交流。 參考文獻 1 VINS-Mono: A

面試心得總結

作者:Xoper.ducky 連結:https://www.nowcoder.com/discuss/3043?type=2&order=0&pos=5&page=2 來源:牛客網   之前實習的時候就想著寫一篇面經,後來忙就給忘了,現在找完工作了,也是該靜

Spring Cloud常見問題總結()

在使用Spring Cloud的過程中,難免會遇到一些問題。所以對Spring Cloud的常用問題做一些總結。 一、整合Hystrix後首次請求失敗 1.1 原因分析     Hystrix 預設的超時時間是1秒,如果在1秒內得不到響應,就會進入 fallbac

java web學習心得總結(1)——jsp基本語法

java web自學快三個月了,前面的基礎知識都忘了,以後每天寫一篇部落格總結一下. 或者關注下我的新浪微博:Mr翅膀君 一.page指令 1.language屬性 <%@ page language="java" import="java.util.*" page

針對《面試心得總結—BAT、網易、蘑菇街》一文中出現的技術問題的收集整理(2)

16. Java面向物件的三個特徵與含義 1 . 封裝性   將物件的狀態資訊儘可能的隱藏在物件內部,只保留有限的介面和方法與外界進行互動,從而避免了外界對物件內部屬性的破壞。   Java中使用訪問控制符來保護對類、變數、方法和構造方法的訪問 2. 繼承    java通

[乾貨,閱後進BAT不是夢]面試心得總結---BAT、網易、蘑菇街

本文轉載自:公眾號:JANiubility 前言   之前實習的時候就想著寫一篇面經,後來忙就給忘了,現在找完工作了,也是該靜下心總結一下走過的路程了,我全盤托出,奉上這篇誠意之作,希望能給未來找工作的人一點指引和總結, 也希望能使大家少走點彎路 , 如果能

面試心得總結—BAT、網易、蘑菇街

先說一下LZ的基本情況,LZ是四川某985學校通訊專業的研究生(非計算機),大學階段也就學了C語言,根本沒想過最後要成為碼農。大四才開始學Java,研一下開始學Android,所以LZ覺得自己開始就是一個小白,慢慢成長起來的。 一、心態 心態很重要! 心態很重要!

面試心得總結-——答案整理

1.一個常見的誤解是以為session在有客戶端訪問時就被建立,然而事實是直到某server端程式呼叫 HttpServletRequest.getSession(true)這樣的語句時才被建立,注意如果JSP沒有顯示的使用<% @page session="fal

針對《面試心得總結—BAT、網易、蘑菇街》一文中出現的技術問題的收集整理(3)

JVM 1. 記憶體模型以及分割槽,需要詳細到每個區放什麼 JVM記憶體區域模型 1.方法區 也稱”永久代” 、“非堆”,  它用於儲存虛擬機器載入的類資訊、常量、靜態變數、是各個執行緒共享的記憶體區域。預設最小值為16MB,最大值為64MB,可以通過-X

面試心得總結(一)

找工作一定要做好Homework,認準準備筆試和麵試,認真研究你投簡歷的公司 如果你能給應聘公司提出建議,指出他們公司產品的不足,可以改進的地方,那應聘成功的機率就回提高 之前有朋友分析了某個公司的Android客戶端App,寫了一份郵

[乾貨,閱後進BAT不是夢]面試心得總結---阿里、小米、騰訊

開發十年,就只剩下這套架構體系了! >>>   

學習 Python Linux系統管理自動化運維 總結

1.文字處理upper:將字串轉換為大寫lower:將字串轉換為小寫isupper:判斷字串是否都是大寫islower:判斷字串是否都是小寫swapcase:將字串中的大寫轉換為小寫、小寫轉換為大寫capitalize:將首字母轉換為大寫istitle:判斷字串是不是一個標題

JavaScript學習總結(十一)——使用JavaScript的數組實現數據結構中的隊列堆棧

運行 icu wql dem aix gaps sdg kml sam 今天在項目中要使用JavaScript實現數據結構中的隊列和堆棧,這裏做一下總結。 一、隊列和堆棧的簡單介紹 1.1、隊列的基本概念   隊列:是一種支持先進先出(FIFO)的集合,即先被插入的數據,先

Python培訓知識總結系列- 第二章Python數據結構第一部分,列表for循環

數據結構 hello actual 答案 系列 define print count man 列表與循環問題 編寫一個函數 tag_count,其參數以字符串列表的形式列出。該函數應該返回字符串中有多少個 XML 標簽。XML 是類似於 HTML 的數據語言。你可以通過一

python學習第十天:閉包函數裝飾器

源代碼 -s 為什麽 pre def func stop 修改 rom 閉包函數: 什麽是閉包函數: 閉指的是定義在一個函數內部 包指的是該函數包含對外部作用域(非全局作用域)名字的引用 def counter():   n=0   d

python全棧學習總結:數字、字符串、列表、元組、字典重要特點及方法

info ted 填充 tde 拼接字符串 enc 支持中文 display sort 一 python中數據類型   整形:int   字符串:str   列表:list   元組:tuple   字典:dict   布爾值:bool   浮點型:float   一切皆對