python經常使用功能(算法)整理

一、冒泡排序

方法一:html

lis = [23,34,23,45,67,222,33,78,98,43,2,3,76,-34,-23]

def sortport():    
    for i in range(len(lis)-1):        
        for j in range(len(lis)-1-i):            
            if lis[j] > lis[j+1]:                
                lis[j],lis[j+1] = lis[j+1],lis[j]    
    return lis
print(sortport())複製代碼

方法二:python

list = [1,4,1,34,23,54,34]
def maopao(list):       
    for i in range(len(list)):        
        for j in range(len(list)-1):            
            if list[i] > list [j]:                
                list[j], list[i] = list[i], list[j] #從大到小 
    print(list)複製代碼

二、編程用sort進行排序,而後從最後一個元素開始判斷,去除重複數字

方法一:git

a=[1,2,4,2,4,5,7,10,5,5,7,8,9,0,3]
a.sort()
last=a[-1]
for i in range(len(a)-2,-1,-1):    
    if last==a[i]:        
        del a[i]    
    else:
        last=a[i]
print(a)複製代碼

方法二:能夠從前面的元素開始判斷去除重複的數字算法

a = [11, 11, 22, 22, 33, 44, 55, 66, 88, 99]
for i in range(len(a)):    
    for j in range(i + 1 , len(a) - 1):        
        if a[i] == a[j]:            
            del a[j]            
            j -= 1
print(a)複製代碼

三、打印九九乘法表

一行代碼實現編程

print('\n'.join([' '.join(['%s*%s=%-2s' % (y,x,x*y) for y in range(1,x+1)]) for x in range(1,10)]))複製代碼

for 循環api

for i in range(1, 10):    
    for j in range(1, i+1):        
        print('{}x{}={}\t'.format(j, i, i*j),end='')        
        # print('%d x %d = %d \t'%(i, j, i*j),end='') 
    print()
# 經過指定end參數的值,能夠取消在末尾輸出回車符,實現不換行。複製代碼

Python2.6 開始,新增了一種格式化字符串的函數 str.format(),它加強了字符串格式化的功能。
基本語法是經過 {} 和 : 來代替之前的 % 。
format 函數能夠接受不限個參數,位置能夠不按順序。
for i in range(1,10):    
    for j in range(1,i+1):        
        string = '%d*%d=%d'%(j,i,j*i)        
        print('%-7s'%string,end="")    
    print('')
# %-7s意思是字符串長度爲7,當原字符串的長度小於7時,在原字符串右側補空格複製代碼
for i in range(1,10):
    for j in range(1,i+1):
        print("%d*%d=%-2d "%(i,j,i*j),end=" ")
    print()複製代碼

首先,引入一個場寬的概念。在C語言中場寬表明格式化輸出字符的寬度。bash

例如:能夠在"%"和字母之間插進數字表示最大場寬。
%3d 表示輸出3位整型數,不夠3位右對齊。
%9.2f 表示輸出場寬爲9的浮點數,其中小數位爲2,整數位爲6,小數點佔一位,不夠9位右對齊。 (注意:小數點前的數字必須大於小數點後的數字。小數點前的數值規定了打印的數字的總寬度。若是忽略了(如:.2f),則意味着總寬度無限制。)
%8s 表示輸出8個字符的字符串,不夠8個字符右對齊。

while循環app

n = 1
while n <= 9:
        m = 1
        while m<= 9:
                print("%d*%d=%2d "%(n,m,n*m), end="")
                m += 1
        print()
        n += 1複製代碼

四、計算階乘

方法一:dom

def fac():    
    num = int(input("請輸入一個數字:"))    
    factorial = 1

# 查看數字是不是負數,0 或者 正數 
    if num < 0:        
        print("抱歉,負數沒有階乘")     
    elif num == 0:        
        print("0 的階乘爲 1")    
    else:        
        for i in range(1, num + 1):            
            factorial = factorial * i        
        print("%d 的 階乘爲 %d" % (num, factorial))
fac()複製代碼

方法二:
ide

def factorial(n):    
    result = n    
    for i in range(1, n):        
        result *= i    
    return result
print(factorial(5))複製代碼

方法三:

def fact(n):    
    if n == 1:        
        return 1    
    return n * fact(n - 1) 
print(fact(5))複製代碼

五、計算x的n次方的方法

def power(x,n):    
    s = 1    
    while n > 0:        
        n = n - 1        
        s = s * x    
    return s
print(power(2,3))複製代碼

六、計算a*a + b*b + c*c + ……

def calc(*numbers):    
    sum = 0    
    for n in numbers:        
        sum = sum + n * n    
    return sum 
print(calc(*[1,2,3]))複製代碼

七、將list中字符串變成小寫

L = ['Hello','World','IBM','Apple']
L2 = []
for s in L:    
    L2.append(s.lower())
print(L2)複製代碼

八、把原字典的鍵值對顛倒並生產新的字典

dict1 = {"A":"a","B":"b","C":"c"}
dict2 = {y:x for x,y in dict1.items()}
print(dict2)複製代碼

九、替換列表中全部的3爲3a

num = ["harden","hampard",3,23,45,23,55,3,3,3,3,4356,546]
# print(num.count(3))
# print(num.index(3))
for i in range(num.count(3)):   #獲取3出現的次數 
    ele_index = num.index(3)    #獲取首次3出現的座標 
    num[ele_index] = "3a"       #修改3爲3a 
    print(num)複製代碼

十、打印每一個名字

L = ["James","Meng","Xin"]
for i in range(len(L)):    
    print("Hellow,%s"%L[i])
複製代碼

善於使用 range() ,會使問題變得簡單

十一、合併去重

list1 = [1,2,3,23,65,3,3,9,8]
list2 = [1,2,3,45,65,3,3,87,45]
list3 = list1 + list2
print(list3)            #不去重進行兩個列表的組合
print(set(list3))       #去重,類型爲set須要轉化爲list
print(list(set(list3)))複製代碼

十二、隨機生成驗證碼

方法一:

import random
list1 = []
# chr() 用一個範圍在 range(256)內的(就是0~255)整數做參數,返回一個對應的字符。
for i in range(65,91):    
    list1.append(chr(i))        #經過for循環遍歷ASCII追加到空列表中
for j in range(97,123):    
    list1.append(chr(j))
for k in range(48,58):    
    list1.append(chr(k))
ma = random.sample(list1,6)
print(ma)           #獲取到的爲空列表
ma = ''.join(ma)    #將列表轉化爲字符串print(ma)複製代碼

方法二:

import random,string
str1 = "0123456789"
str2 = string.ascii_letters
str3 = str1 + str2
ma1 = random.sample(str3,6)
ma1 = ''.join(ma1)
print(ma1)複製代碼

1三、計算平方根

num = float(input('請輸入一個數字: '))
num_sqrt = num ** 0.5
print(' %0.2f 的平方根爲 %0.2f'%(num,num_sqrt))複製代碼

1四、判斷字符串是否只由數字組成

def is_number(s):    
    try:        
        float(s)        
        return True    
    except ValueError:        
        pass    
    try:        
        import unicodedata        
        unicodedata.numeric(s)        
        return True    
    except (TypeError, ValueError):        
        pass    
    return False
# print(is_number('12w3'))


chri = "123w"
print(chri.isdigit())           #檢測字符串是否只由數字組成
print(chri.isnumeric())         #檢測字符串是否只由數字組成,這種方法只針對unicode對象複製代碼

1五、判斷奇偶數

方法一:

num = int(input("請輸入一個數字: "))
if (num % 2) == 0:    
    print("{0} 是偶數".format(num))
else:    
    print("{0} 是奇數".format(num))複製代碼

方法二:

while True:    
    try:        
        num = int(input('請輸入一個整數: '))  #判斷輸入是否爲整數 
    except ValueError:                         #不是純數字須要從新輸入 
        print("輸入的不是整數!")        
        continue    
    if num % 2 == 0:        
        print("偶數")    
    else:        
        print("奇數")    
    break複製代碼

1六、判斷閏年

方法一:

year = int(input("輸入一個年份: "))
if (year % 4) == 0:    
    if (year % 100) == 0:        
        if (year % 400) == 0:            
            print("{0} 是閏年".format(year))        #整百年能被400整除是閏年 
        else:            
            print("{0} 不是閏年".format(year))    
    else:        
        print("{0} 是閏年".format(year))           #非整百年能被4整除爲閏年
else:    
    print("{0} 不是閏年".format(year))複製代碼

方法二:

year = int(input("輸入一個年份: "))
if (year % 4) == 0 and (year % 100) != 0 or (year % 400) == 0:    
    print("{0} 是閏年".format(year))
else:    
    print("{0} 不是閏年".format(year))複製代碼

方法三:

import calendar #日曆模塊

print(calendar.month(2018, 6))

year = int(input("請輸入年份:"))
check_year = calendar.isleap(year)
if check_year == True:    
    print("%d是閏年"% year)
else:    
    print("%d是平年"% year)複製代碼

1七、獲取最大值

方法一:

# 獲取最大值N = int(input("輸入須要對比大小數字的個數:"))
print("請輸入須要對比的數字:")
num = []
for i in range(1,N+1):    
    temp = int(input("請輸入第%d個數字:" % i))    
    num.append(temp)print('您輸入的數字爲:',num)

print('最大值爲:',max(num))複製代碼

方法二:

N = int(input("輸入須要對比大小數字的個數:\n"))

num = [ int(input('請輸入第 %d 個對比數字:\n'%i))for i in range(1,N+1) ]

print('您輸入的數字爲:',num)
print('最大值爲:',max(num))複製代碼

1八、斐波那契數列

斐波那契數列(Fibonacci sequence),又稱黃金分割數列、因數學家列昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖爲例子而引入,故又稱爲「兔子數列」,指的是這樣一個數列:一、一、二、三、五、八、1三、2一、3四、……在數學上,斐波納契數列以以下被以遞歸的方法定義:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=2,n∈N*)

斐波那契數列,難點在於算法,還有若是變成生成器,generator,就要用for循環去遍歷可迭代的generator

方法一:

不少種解法,我是按照分割的方式,每次取列表後兩項,而後相加。

def six():    
    l = [0,1]    
    for i in range(10):        
        arr = l[-2:]        
        l.append(arr[0]+arr[1])    
    return(l)
print(six())複製代碼

方法二:遞歸法

def fib_recur(n):    
    assert n >= 0, "n > 0"    
    if n <= 1:        
        return n    
    return fib_recur(n-1) + fib_recur(n-2)

for i in range(1, 20):    
    print(fib_recur(i), end=' ')複製代碼

寫法最簡潔,可是效率最低,會出現大量的重複計算,時間複雜度O(1.618^n),並且最深度1000

方法三:遞推法

def fib_loop(n):    
    a, b = 0, 1    
    for i in range(n + 1):       
        a, b = b, a + b    
    return a

for i in range(20):  
    print(fib_loop(i), end=' ')複製代碼

遞推法,就是遞增法,時間複雜度是 O(n),呈線性增加,若是數據量巨大,速度會越拖越慢

方法四:矩陣

### 1
import numpy
def fib_matrix(n):    
    res = pow((numpy.matrix([[1, 1], [1, 0]])), n) * numpy.matrix([[1], [0]])    
    return res[0][0]
for i in range(10):    
    print(int(fib_matrix(i)), end=', ')

### 2
# 使用矩陣計算斐波那契數列
def Fibonacci_Matrix_tool(n):    
    Matrix = numpy.matrix("1 1;1 0")    
    # 返回是matrix類型 
    return pow(Matrix, n)  # pow函數速度快於 使用雙星好 **

def Fibonacci_Matrix(n):    
    result_list = []    
    for i in range(0, n):        
        result_list.append(numpy.array(Fibonacci_Matrix_tool(i))[0][0])    
    return result_list
# 調用
Fibonacci_Matrix(10)複製代碼

由於冪運算可使用二分加速,因此矩陣法的時間複雜度爲 O(log n)
用科學計算包numpy來實現矩陣法 O(log n)


方法五:生成器

def fib_loop_while(max):    
    a, b = 0, 1    
    while max > 0:        
        a, b = b, a + b        
        max -= 1        
        yield a
for i in fib_loop_while(10):    
    print(i,end=',')複製代碼

帶有yield的函數都被當作生成器,生成器是可迭代對象,且具有__iter__ 和 __next__方法, 能夠遍歷獲取元素
python要求迭代器自己也是可迭代的,因此咱們還要爲迭代器實現__iter__方法,而__iter__方法要返回一個迭代器,迭代器自身正是一個迭代器,因此迭代器的__iter__方法返回自身便可

方法六:類實現內部魔法方法

class Fibonacci(object):    
    """斐波那契數列迭代器"""  
  
    def __init__(self, n):    
        """ :param n:int 指 生成數列的個數 """        
        self.n = n        
        # 保存當前生成到的數據列的第幾個數據,生成器中性質,記錄位置,下一個位置的數據 
        self.current = 0        
        # 兩個初始值 
        self.a = 0        
        self.b = 1    

    def __next__(self):        
        """當使用next()函數調用時,就會獲取下一個數"""        
        if self.current < self.n:            
            self.a, self.b = self.b, self.a + self.b            
            self.current += 1            
            return self.a        
        else:            
            raise StopIteration
   
            def __iter__(self):        
        """迭代器的__iter__ 返回自身便可"""        
return self


    if __name__ == '__main__':    
        fib = Fibonacci(15)    
        for num in fib:        
            print(num,end=',')



# for循環的本質是經過不斷調用next()函數實現的
for x in [1, 2, 3, 4, 5]:    
    pass

# 至關於
# 首先獲取可迭代對象 
    it = iter([1, 2, 3, 4, 5])    
    # while next 
    while True:        
        try:            
            next(it)        
        except StopIteration:            
            # 遇到StopIteration就退出循環 
            break複製代碼

1九、十進制轉二進制、八進制、十六進制

# 獲取輸入十進制數
dec = int(input("輸入數字:"))

print("十進制數爲:", dec)
print("轉化二進制爲:", bin(dec))
print("轉化八進制爲:", oct(dec))
print("轉化十六進制爲:", hex(dec))複製代碼

20、簡單計算器

# 定義函數
def add(x, y):    
    """ 相加 """    
    return x + y

def subtract(x, y):    
    """ 相減 """    
    return x - y

def multiply(x, y):    
    """ 相乘 """    
    return x * y

def divide(x, y):    
    """ 相除 """    
    return x / y

# 用戶輸入print("選擇運算:")
print("一、相加")
print("二、相減")
print("三、相乘")
print("四、相除")

choice = input("輸入你的選擇(1/2/3/4):")

num1 = int(input("輸入第一個數字:"))
num2 = int(input("輸入第二個數字:"))

if choice == "1":    
    print(num1, "+", num2, "=", add(num1, num2))
elif choice == "2":    
    print(num1, "-", num2, "=", subtract(num1, num2))
elif choice == "3":    
    print(num1, "*", num2, "=", multiply(num1, num2))
elif choice == "4":    
    if num2 != 0:        
        print(num1, "/", num2, "=", divide(num1, num2))    
    else:        
        print("分母不能爲0")
else:    
    print("非法輸入")複製代碼

2一、生成日曆

# 引入日曆模塊
import calendar

# 輸入指定年月
yy = int(input("輸入年份:"))
mm = int(input("輸入月份:"))

# 顯示日曆
print(calendar.month(yy, mm))複製代碼

2二、字符串判斷

#測試實例一
print("測試實例一")
str = "runoob.com"print(str.isalnum())    
#判斷全部字符都是數字或者字母
print(str.isalpha())    #判斷有所字符都是字母
print(str.isdigit())    #判斷有所字符都是數字
print(str.islower())    #判斷有所字符都是小寫
print(str.isupper())    #判斷有所字符都是大寫
print(str.istitle())    #判斷有所單詞都是首字母大寫,像標題
print(str.isspace())    #判斷有所字符都是空白字符、\t、\r、\n

print("-------------------------")

print("測試實例二")
str = "Bake corN"
print(str.isalnum())    
print(str.isalpha())    
print(str.isdigit())    
print(str.islower())    
print(str.isupper())    
print(str.istitle())    
print(str.isspace())   複製代碼

2三、字符串大小寫轉換

str = "https://juejin.im/user/"
print(str.upper())      # 把全部字符中的小寫字母轉化成大寫字母
print(str.lower())      # 把全部字符中的大寫字母轉化小寫字母
print(str.capitalize()) # 把第一個字母轉化成大寫字母,其他小寫
print(str.title())      # 把每一個單詞的第一個字母轉化爲大寫,其他爲小寫複製代碼

2四、計算每月的天數

import calendar
monthRange = calendar.monthrange(2019,11)
print(monthRange)複製代碼

2五、獲取昨天的日期

# 引入 datetime 模塊
import datetimedef getYesterday():    
    today = datetime.date.today()    
    oneday = datetime.timedelta(days=1)    
    yesterday = today - oneday    
    return yesterday

print(getYesterday())複製代碼

2六、趣味天然數

掌握使用自定義函數實現水仙花數和徹底數

水仙花數(narcissistic number)中的narcissistic本意是「自我陶醉,自賞的,自戀的」。
在希臘神話中,貌美青年那喀索斯(narcissus)愛上了本身在水中的倒影,他死後化做水仙花,此花
即因之命名。因此,水仙花數也稱爲自戀數,自冪數,本名爲超徹底數字不變數(pluperfect digital invariant, PPDl)
水仙花數,在咱們認識的大概認知,數學概念的自幕數是這樣解釋的。
自冪數是指一個 n 位數,它的每一個位上的數字的 n 次冪之和等於它自己。
n爲1時,自冪數稱爲獨身數。顯然,0,1,2,3,4,5,6,7,8,9都是自冪數。
n爲2時,沒有自冪數。
n爲3時,自冪數稱爲水仙花數,有4個:153,370,371,407;
n爲4時,自冪數稱爲四葉玫瑰數,共有3個:1634,8208,9474;
n爲5時,自冪數稱爲五角星數,共有3個:54748,92727,93084;
n爲6時,自冪數稱爲六合數, 只有1個:548834;
n爲7時,自冪數稱爲北斗七星數, 共有4個:1741725,4210818,9800817,9926315;
n爲8時,自冪數稱爲八仙數, 共有3個:24678050,24678051,88593477;
n爲9時,自冪數稱爲九九重陽數,共有4個:146511208,472335975,534494836,912985153;
n爲10時,自冪數稱爲十全十美數,只有1個:4679307774。複製代碼

話很少說,來代碼:

#若是一個 3 位數等於其各位數字的立方和,則稱這個數爲水仙花數。 
#例如:153 = 1^3 + 5^3 + 3^3,所以 153 就是一個水仙花數。 
 
#方法1:
def flower1(a,b):     # 限制範圍
    for i in range(a,b):        
        sum = 0  #用來存放各個位數的立方和 
        temp = i        
        while temp:            
            sum += (temp%10) ** 3   #累加 
            temp //= 10 # // 取整除 - 向下取接近除數的整數 
        if sum == i:            
            print(i)flower1(10,1000) # 153 370 371 407複製代碼

還能夠先定義一個求冪次方和的函數

import math# 定義一個函數求取列表中的冪次方和
def pow3(list):    
sum = 0    
for i in list:        
    sum += math.pow(int(i),3)    
    return sum複製代碼

# 方法2 依次求取各個位數 def flower(): 
    for i in range(100,1000):        
        a = i // 1000    # 取最高位 
        b = i //100 % 10 # 取百位 
        c = i //10 % 10  # 取十位 
        d = i % 10      # 取末位 
        list = [a,b,c,d]        
        if pow3(list) == i:            
            print('100-1000之內的水仙花數有:%d'%i)
flower()

#100-1000之內的水仙花數有:153
#100-1000之內的水仙花數有:370
#100-1000之內的水仙花數有:371
#100-1000之內的水仙花數有:407複製代碼


# 方法3: 數值轉爲list def flower2(): 
    for i in range(100, 1000):        
        list1 = list(str(i))        
        if pow3(list1) == i:            
            print('100-1000之內的水仙花數有:%d'%i)
flower2()

#100-1000之內的水仙花數有:153
#100-1000之內的水仙花數有:370
#100-1000之內的水仙花數有:371
#100-1000之內的水仙花數有:407複製代碼

2七、徹底數

若是一個數剛好等於它的因子之和,則稱該數爲「徹底數」 。各個小於它的約數(真約數,列出某數的約數,去掉該數自己,剩下的就是它的真約數)的和等於它自己的天然數叫作徹底數(Perfect number),又稱完美數或完備數。

例如:
第一個徹底數是6,它有約數一、二、三、6,除去它自己6外,其他3個數相加,1+2+3=6。
第二個徹底數是28,它有約數一、二、四、七、1四、28,除去它自己28外,其他5個數相加,1+2+4+7+14=28
那麼問題來了:如何用python去求出下一個(大於28的)徹底數?
(求出1000之內全部的徹底數)

方法一

# coding:utf-8
a=range(1,1001)
b=range(1,1001)
result=[]
for i in a:    
    tmp=[]    
for k in b:        
    if k<i:            
        if not i%k:                
            tmp.append(k)            
        else:                
            continue        
    else:            
        break    
    count=0    
    for m in tmp:        
        count=count+m    
    if count==i:        
        result.append(i)    
    else:        
        continue
print result複製代碼
上面的方法中,求tmp這個list中元素的和時,咱們也能夠經過sum函數實現,具體以下:

方法二

# coding:utf-8
a=range(1,1001)
b=range(1,1001)
result=[]
for i in a:    
    tmp=[]    
    for k in b:        
        if k<i:            
            if not i%k:                
                tmp.append(k)            
            else:                
                continue        
        else:            
            break    
    count=sum(tmp)    
    if count==i:        
        result.append(i)    
    else:        
    continue
print result複製代碼
#方法三
#方法三是直接經過遍歷出list a中的元素後,生成一個小於次元素的list,而後取餘
#對於range(1,0) 個人解釋是:range的理解應該是range是先用咱們指定的條件生成一個列表,
而後用for循環取出來(此句出自python核心編程第八章),range(1,0),start=1,stop=0,step=1,
這樣的條件生成的#的列表實際是上空的,即爲False複製代碼
a=range(1,1001)
perfect=[]
for i in a:    
    tmp=[]    
    for k in range(1,i):        
        if not i%k:            
            tmp.append(k)    
    count=sum(tmp)    
    if count==i:        
        perfect.append(i)
print perfect複製代碼
方法四(史上最簡單的方式了)

for i in range(1,1000):  
    s=0  
    for k in range(1,i):    
        if i%k==0:      
            s=s+k  
    if i==s:    
        print i複製代碼

2八、最大公約數和最小公倍數

掌握結合python循環求解最大公約數

def hcf(x, y):    
    '''該函數返回兩個數的最大公約數'''  
  
    # 獲取最小值 
    if x > y:        
        smaller = y    
    else:        
        smaller = x        

    for i in range(1, smaller + 1):        
        if ((x % i == 0) and (y % i == 0)):            
            hcf = 1    
    return hcf

# 用戶輸入兩個數字

num1 = int(input("輸入第一個數字:"))
num2 = int(input("輸入第二個數字:"))

print(num1, "和", num2, "的最大公約數爲", hcf(num1, num2))複製代碼

最小公倍數

# 定義函數
def lcm(x, y):   
 
    #獲取最大的數 
    if x > y:        
        greater = x    
    else:        
        greater = y
    
    while(True):        
        if ((greater % x == 0) and (greater % y == 0)):            
            lcm = greater            
            break        
        greater += 1   
 
    return lcm

# 獲取用戶輸入
num1 = int(input("輸入第一個數字:"))
num2 = int(input("輸入第二個數字:"))
print(num1, "和", num2, "的最小公倍數爲", lcm(num1, num2)) 複製代碼

2九、浮屠增級

掌握使用枚舉解決浮屠增級問題

30、千錢百雞

掌握使用枚舉法解決千錢百雞問題

百錢百雞:我國古代數學家張丘建在《算經》一書中提出的數學問題:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?
譯文:公雞一隻5元,母雞一隻3元,小雞3只1元。如何用100元買100只雞。其中公雞,母雞,小雞的數量各是多少
  窮舉法
 分析:公雞最多買:20只,母雞最多買:33只。設:公雞x只,母雞y只,小雞z只
 則 0<x<20, 0<y<33, z=100-x-y
for x in range(0,20):    
    for y in range(0,33):        
        z=100-x-y        
        if 5*x+3*y+z/3 == 100:            
            print('公雞:%s 母雞:%s 小雞:%s'%(x, y, z))複製代碼

隨機數法

分析:公雞最多買:20只,母雞最多買:33只。設:公雞x只,母雞y只,小雞z只

import random
while True:    
    x = random.randrange(0,20)    
    y = random.randrange(0,33)    
    z = random.randrange(0,100)    
    if 5*x+3*y+z/3 == 100 and x+y+z == 100:        
        print('公雞:',x)        
        print('母雞:',y)        
        print('小雞:',z)複製代碼

3一、猜數字的小遊戲

# python實現猜數字遊戲,主要用於練習for循環和if else。
# 需求以下:# 一、隨機生成一個1-100之間的數。
# 二、7次猜數字的機會,若是沒有猜正確,遊戲結束。
# 三、輸入字母q,則退出遊戲。

import random
num = random.randint(1,100)
guess_chances = 7
print('您只有7次猜數字的機會哦!') 
for i in range(1,guess_chances + 1):    
    print('這是第'+ str(i) + '次猜數字')    
    guess = input('請輸入數字:')    
    if guess.isdigit():       
        guess = int(guess)       
        if guess < num:           
            print('您輸入的數字過小了,您還有' + str(guess_chances - i)+'次機會,請從新輸入:')
        elif guess > num:           
            print('您輸入的數字太大了,您還有' + str(guess_chances - i)+'次機會,請從新輸入:')
        elif guess == num:          
            print('恭喜您猜對了')           
            break    
        elif guess == 'q':        
            print('退出遊戲!')        
            break    
    else:        
        print('輸入的內容必須爲整數,請從新輸入:')
while (guess_chances - i) == 0:    
    print('您輸入已經超過7次,遊戲結束!')    
    break複製代碼

隨機數字小遊戲

import random
i = 1
a = random.randint(0,100)
b = int(input('請輸入0-100中的一個數字\n而後查看是否與電腦同樣:'))
while a != b:    
    if a > b:        
        print('你第%d次輸入的數字小於電腦隨機數字'%i)        
        b = int(input('請再次輸入數字:'))    
    else:        
        print('你第%d次輸入的數字大於電腦隨機數字'%i)        
        b = int(input('請再次輸入數字:'))    
    i += 1
else:    
    print('恭喜你,你第%d次輸入b的數字與電腦的隨機數字%d同樣'%(i,b))複製代碼

3二、打印圖形

三角形

for i in range(10):
    for j in range(1,i):
        print("*",end="")
    print()

for i in range(10):
    for j in range(10-i):
        print("*",end="")
    print()複製代碼

正方形

for i in range(5):
    for j in range(10):
        print("*",end="")
    print()複製代碼

正三角形

for i in range(1,6):
    for j in range(1,6-i):
        print(" ",end="")
    for k in range(1,i+1):
        print("* ",end="")
    print("")複製代碼

3三、請編寫1-100全部數的和。

#for循環
sum = 0
for i in range(1,101):    
    sum += i
print(sum)


#while循環
n = 1
sum = 0while n < 101:    
    sum += n    
    n += 1
print(sum)複製代碼

3四、編寫代碼,實現求100-200裏面全部的素數

sum = 0
for i in range(100,200):    
    flag = True    
    for j in range(2,i):        
        if i % j == 0:            
            flag = False            
            break    
        if(flag):        
            print(i,"是素數")        
            sum += 1
print("一共",sum,"個素數")複製代碼

3五、漢諾塔()

ta1 = [i for i in range(10,0,-1)]
ta2 = []
ta3 = []
n = len(ta1)


def move(n, ta1,ta2,ta3):
    if n == 1:
        ta3.append(ta1.pop())
    else:
        move(n - 1,ta1,ta3,ta2)
        ta3.append(ta1.pop())
        move(n-1,ta2,ta1,ta3)


move(n,ta1,ta2,ta3)
print(ta1)
print(ta3)複製代碼

3六、字符串,列表,字典,綜合實戰1 

列出1到20的數字,如果3的倍數就用apple代替,如果5的倍數就用orange代替,#若既是3的

倍數又是5的倍數就用appleorange代替。注意:只能用2行代碼搞定

咱們最常常想到的應該是這種方法:

for i in range(1,21):    
    if (i%3==0 and i%5!=0):        
        i = 'apple'    
    elif (i%5==0 and i%3!=0):        
        i = 'orange'    
    elif (i%3==0 and i%5==0):        
        i = 'appleorange'    
    print(i,end=',')複製代碼

經典的寫法:

for i in range(1,21):    
    print('apple'[i%3*5::]+'orange'[i%5*6::] or i,end=" , ")複製代碼

深刻解析:

  • 其實算法很簡單,就是i對3和5取模,可是能2行搞定,精妙之處在於利用了字符串切片的一個特性

  • 好比apple[5::],結果爲空,爲何,由於下標5的位置不存在,因此爲空,那麼apple[i%3*5],意味着i在1,2,3,4的時候取3的模,結果是1,2,0,1,而後用一個很巧妙的方法*5(5實際上是apple的長度),作了一個偏移

  • 這樣在3的整數的時候下面0*5=0,也就是從0開始取apple,而1,2,4的時候取3模是1,2,1,再乘以5就越界了因此取的apple爲空.

  • 同理orange也是這樣的,取5的模,而後*6(6是orange的長度)偏移

  • 最後用了一個or i ,先來講一下or, Python 對or 的判斷是,print A or B ,若A爲true,則結果爲True,若A是false再判斷B,B是true,則結果是True

  • print 'apple'[i%3*5::]+'orange'[i%5*6::] or i,表示當apple和orange偏移越界了就都爲空的時候,就取i的值,是1,2,4,7...

3七、字符串,列表,字典,綜合實戰2 

好比說我有一串字符串人名:names=' Kunpen Ji, Li XIAO, Caron Li, Donl SHI, Ji ZHAO, Fia YUAN Y, Weue DING, Xiu XU, Haiying WANG, Hai LIN, Jey JIANG, Joson WANG E, Aiyang ZHANG, Hay MENG, Jak ZHANG E, Chang Zhang, Coro ZHANG',我但願能作到下面3點

問題1:排序,按照名字A-Z排序

問題2:找出裏面姓」ZHANG」有幾個

問題3:找出名字裏面最長的人


首先咱們要作的對字符串進行分割去掉','而後就變成了一個長的列表,而後對列表進行排序,第一個問題就解決了.

for index,n in enumerate(sorted(names.split(','))):	
    print(index+1,n)複製代碼

分析問題2:

接下來,咱們須要找出姓"ZHANG",由於名字裏面有英文名字和中文名字,有的後面還跟E/Y,因此咱們先定義一個函數,把分割後的新的名字列表,取出每個名字,而後解析,翻轉,用推導列表造成一個新的名字列表,而後再用字符串裏的.startswith("ZHANG")取出符合的名字

def _change(text):	
    new_s1=text.split()[0:2]	
    reverse_s1=new_s1[::-1]	
    return ' '.join(reverse_s1)

new_names_lists=[_change(name) for name in names.split(',')]
names_with_ZHANG=[name for name in new_names_lists if name.startswith('ZHANG')]
print(names_with_ZHANG)
>>['ZHANG Aiyang', 'ZHANG Jak', 'ZHANG Coro']複製代碼

分析問題3:

接下來,咱們只要把名字和名字的長度,造成一個新的字典,名字:名字長度,而後就能夠很是容易取到最大的人名了.

names_dict={name:len(name) for name in sorted(names.split(',')) }
print(max(zip(names_dict.values(),names_dict.keys())))
>>(13, ' Joson WANG E')複製代碼

一、turtle庫的使用

Turtle,也叫海龜渲染器,使用Turtle庫畫圖也叫海龜做圖。Turtle庫是Python語言中一個很流行的繪製圖像的函數庫。海龜渲染器,和各類三維軟件都有着良好的結合。功能強大,使用方便。該渲染器的特點在於其渲染速度能夠優海龜渲染器,和各類三維軟件都有着良好的結合。

(1)畫圓

(circle() 有三個參數:radius必須,extent--角度 與step--圖形(無關緊要)) 複製代碼

一、radius -- 任意大小圓

import turtle 
t = turtle.Turtle() 
t.circle(x) 複製代碼

二、radius extent --- 任意大小圓得部分

# 半圓
import turtle
t = turtle.Turtle()
t.circle(100,180) 複製代碼

三、

radius  extent  steps  # 可實現多邊形的繪製
import turtle
t = turtle.Turtle()
t.circle(100,180,3) 複製代碼

四、

radius step  #三角形 
import turtle
t = turtle.Turtle()
t.circle(100,steps=3) 複製代碼

五、實心圓

t.hot() 複製代碼

(2)畫筆的轉換(shape()函數的使用)可填寫以下圖形:

一、海龜 turtle

二、等邊三角形 triangle 等腰三角形 arrow

三、正方形 square

四、實心圓 circle

(3)畫筆的繪製狀態

一、pendown()

二、penup()

三、pensize() #可直接寫數字

(4)畫筆的運動狀態

一、t.forward() / t.fd()箭頭方向前進

二、t.backward() / t.bd() ------後退

三、t.left() / t.right()

四、t.goto() / t.setpos() ----移到某一位置

五、t.setx() / t.sety() ---- 改變x座標或者Y座標

六、t.home() ---- 回到初始位置

七、t.position() / t.pos() print(t.pos)---返回當前箭頭座標

(4)畫筆的隱藏與顯示

一、隱藏 hideturtle() / ht()

二、顯示 showturtle() / st()

(5)顏色

一、turtle.begin_fill():在填充圖形前訪問這個方法

二、turtle.end_fill():在最後調用begin_fill以前填充繪製的圖形

三、turtle.color(c):設置筆的顏色

四、turtle.fillcolor(c):設置筆填充顏色

一、在begin_fill()和end_fill()之間設置的turtle.color(c)和turtle.fillcolor(c)均可以做爲填充色 二、將turtle.color(c)提到前面,不寫begin_fill()和end_fill(),則就不會實現填充

三、將turtle.color(c)提到前面,並在begin_fill()和end_fill()之間設置turtle.fillcolor(c),那麼圖形的邊框和內部填充顏色分別對應於color和fillcolor

四、在begin_fill()和end_fill()之間設置不一樣的turtle.color(c)和turtle.fillcolor(c),則以排序在後面的爲準去填充圖形

補充:

(1)

input # 輸入的數字爲字符串
import turtle
num = int(input(""))
t = turtle.Turtle()
t.circle(num) 複製代碼

(2)

random

print( random.randint(1,10) )        # 產生 1 到 10 的一個整數型隨機數 
print( random.random() )             # 產生 0 到 1 之間的隨機浮點數
print( random.uniform(1.1,5.4) )     # 產生 1.1 到 5.4 之間的隨機浮點數,區間能夠不是整數
print( random.choice('tomorrow') )   # 從序列中隨機選取一個元素
print( random.randrange(1,100,2) )   # 生成從1到100的間隔爲2的隨機整數


turtle、input、random可相互結合演示  複製代碼

擴展:

1.forward() | fd():向前移動指定的距離。參數:一個數字(integer or float))。

turtle.forward(25)複製代碼

2.backward() | bk() | back():向後移動指定的距離。參數:一個數字(integer or float))。

turtle.backward(30)複製代碼

3.right() | rt():以角度單位向右轉動。參數:一個數字(integer or float))。單位默認爲度數,能夠經過degrees()和radians()進行設置

turtle.right(45)複製代碼

4.left() | lt():以角度單位向左轉動。參數:一個數字(integer or float))。單位默認爲度數,能夠經過degrees()和radians()進行設置。

turtle.left(45)  複製代碼

5.goto() | steps() | setposition():移動到絕對位置,若是筆落下,畫線,不改變方向。參數:x-一個數字或一對數字。y-一個數字或None。

turtle.setpos(60,30)#60.00,30.00)複製代碼

6.setx():設置第一個座標的值即X方向。參數:一個數字(integer or float))。

turtle.setx(10)#(10.00,0.00)複製代碼

7.sety():設置第二個座標的值即Y方向。參數:一個數字(integer or float))。

turtle.sety(10)#(0.00,10.00)複製代碼

8.setheading() | seth(): 將方向設置爲to_angle.就是東西南北方向。具體以下:標準模式:0 - 東 90 - 北 180 - 西 270 - 南 標誌模式 0- 北 90- 東 180- 南 270 - 西

turtle.setheading(90)複製代碼

9.home() : 移動到原點 - 座標(0,0):並將其標題設置爲其起始方向(取決於模式)。

turtle.home()# (0.00,0.00)複製代碼

10.circle():繪製一個給定半徑的圓。參數:radius-一個數字(半徑,若是值爲正則逆時針,負數爲順時針),extent-一個數字()steps- 執行的步數。

turtle.circle(120,180,5)複製代碼

11.dot() :用顏色畫出一個直徑大小的圓點。參數:size-一個大於1的整數,可None。默認用的是pensize+4和2*pensize的最大值,color-顏色值

turtle.dot(20, "blue")複製代碼

12.stamp():將當前位置上的形狀複製到畫布上返回stamp_id.能夠調用,能夠刪除。

turtle.stamp()複製代碼

13.clearstamp():刪除stamp()返回來的值。參數:stampid。
14.clearstamps():刪除所有stamp()的值。參數:stampid。

15.undo():撤銷最後的動做。

16.speed():將速度設置爲0..10範圍內整數。若是沒有參數,則返回當前速度。若是大於10或

者小於0.5,則速度設置爲0 。

  • 最快」:0 :直接成圖,沒有動畫效果
  • 「快」:10:大概一秒
  • 「正常」:6:
  • 「慢」:3
  • 「最慢」:1

17:position() | pos(): 返回當前的位置。

turtle.pos()
# (0.00,0.00)複製代碼

18.towards(): 返回當前位置同指定位置之間的角度。參數:x-一個數字或一對數字或一個實

例的向量,y-若是x是數字,則爲數字,不然爲None。

turtle.goto(10,10)
tw = turtle.towards(0,0)
print(tw)
# 225複製代碼

19.xcor():返回x座標。 ycor():返回y座標。

20.heading(): 返回當前的方向值。

21.distance():返回x,y兩個點的直線距離

22.degrees():設置一整圈的度數。默認是360度。

23.radians():將角度測量單位設置爲弧度。至關於 degrees(2*math.pi)

24.pendown() | pd() | down():放下筆,移動的時候繪圖。

25.penup() | pu() | up():將提起筆,移動時無圖。

26.pensize():設置線條的粗細。參數:width-一個正數

27.pen():使用鍵值對設置筆的屬性:

「shown」: True/False

「pendown」: True/False

「pencolor」: 顏色字符串或者顏色值

「fillcolor」: 顏色字符串或者顏色值

「pensize」: 正數 「speed」: 速度範圍爲0..10的數字

「resizemode」: 「auto」 or 「user」 or 「noresize」

「stretchfactor」: (positive number, positive number)

「outline」: 正數

「tilt」: 正數

28.isdown():若是筆中止返回True,反之False

29.pencolor():設置筆的顏色。

30.fillcolor():筆的填充色。

31.color():同時設置pencolor和fillcolor

32.filling():返回fillstate狀態,若是填充則返回True,反之False。

33.begin_fill():在繪製要填充的形狀前調用。固然在調用完還須要end_fill()。

34.reset():重置,將屏幕中的圖紙刪除,從新居中並將全部變量設置爲默認值。

35.clear():刪除圖紙。對屬性不作操做。

36.write():寫文本。參數:arg-要寫入的對象。move-是否移動。align-對齊方式:left,right,center。font-字體。fontname,fontsize,fonttype。

37.ideturtle() | ht() :刪隱藏烏龜的形狀,在作複雜繪圖的時候隱藏的時候有利於提升繪圖速度。

38.showturtle() | st():顯示烏龜的形狀。


39.isvisible():烏龜是否可見。

若是可見返回True,反之則False。 40.shape():設置烏龜的圖形形狀,取值:「arrow」, 「turtle」, 「circle」, 「square」, 「triangle」, 「classic」 41.isvisible():烏龜是否可見。若是可見返回True,反之則False。

42.resizemode():參數:rmode取值:"auto","user","noresize".

43.shapesize() | turtlesize() : 返回筆的屬性。

44.shearfactor(): 設置或者返回但錢的剪切因子。

45.tilt():旋轉由turtle shape角度從當前的傾斜角度。

46.settiltangle():不管當前的傾斜角度如何,旋轉烏龜指向 angle 指定的方向。參數:angle -數字。已棄用

47.tiltangle():設置或者返回當前的傾斜角度。參數:angle - 數字

48.shapetransform():設置或返回烏龜的形狀的當前轉換矩陣。

49.get_shapepoly():返回當前形狀的座標。

50.onclick():鼠標點擊事件。

參數:fun-一個帶有兩個參數的函數,這些參數將與畫布上單擊點的座標一個調用。num-鼠標按鈕的數量,默認爲1(左鍵)。add- True的時候將添加新的綁定。不然替換之前的綁定。

51.onrelease():鼠標釋放事件。參數同點擊事件。

52.ondrag():鼠標移動事件。參數同點擊事件。

53.begin_poly(): 開始記錄多邊形的頂點。

54.end_poly():中止記錄多邊形的頂點。

55.get_poly():返回最後記錄的多邊形。

56.clone():建立並返回具備相同位置等等屬性的烏龜克隆。

57.getturtle() | getpen() :獲取trutle對象自己。

58.getscreen():返回正在繪製的對象。

59.setundobuffer(): 設置或禁用中斷器。

參數: size-整數。若是大小是None,則禁用緩衝區。 60.undobufferentries():返回undobuffer中的條目數。

61.bgcolor():設置或者返回當前的TurtleScreen的背景顏色。

62.bgpic():設置背景圖片。參數: picname-文件名。

62.delay(): 設置或返回以毫秒爲單位的繪製延遲,延遲越大,繪圖越慢。

63.ontimer():定時器。

64.mainloop() | done() :開始循環 。

65.textinput() | numinput():彈出一個輸入字符串和數字的窗口。

66.mode(): 三種方式:「standard」, 「logo」 or 「world」

案例:時鐘


# coding=utf-8
 
import turtle
from datetime import *
 
 
# 擡起畫筆,向前運動一段距離放下
def Skip(step):
    turtle.penup()
    turtle.forward(step)
    turtle.pendown()
 
 
def mkHand(name, length):
    # 註冊Turtle形狀,創建錶針Turtle
    turtle.reset()
    Skip(-length * 0.1)
    # 開始記錄多邊形的頂點。當前的烏龜位置是多邊形的第一個頂點。
    turtle.begin_poly()
    turtle.forward(length * 1.1)
    # 中止記錄多邊形的頂點。當前的烏龜位置是多邊形的最後一個頂點。將與第一個頂點相連。
    turtle.end_poly()
    # 返回最後記錄的多邊形。
    handForm = turtle.get_poly()
    turtle.register_shape(name, handForm)
 
 
def Init():
    global secHand, minHand, hurHand, printer
    # 重置Turtle指向北
    turtle.mode("logo")
    # 創建三個錶針Turtle並初始化
    mkHand("secHand", 135)
    mkHand("minHand", 125)
    mkHand("hurHand", 90)
    secHand = turtle.Turtle()
    secHand.shape("secHand")
    minHand = turtle.Turtle()
    minHand.shape("minHand")
    hurHand = turtle.Turtle()
    hurHand.shape("hurHand")
 
    for hand in secHand, minHand, hurHand:
        hand.shapesize(1, 1, 3)
        hand.speed(0)
 
        # 創建輸出文字Turtle
    printer = turtle.Turtle()
 
    # 隱藏畫筆的turtle形狀
    printer.hideturtle()
    printer.penup()
 
 
def SetupClock(radius):
    # 創建表的外框
    turtle.reset()
    turtle.pensize(7)
    turtle.pencolor("#ff5500")
    turtle.fillcolor("green")
 
    for i in range(60):
        Skip(radius)
        if i % 5 == 0:
            turtle.forward(20)
            Skip(-radius - 20)
 
            Skip(radius + 20)
            if i == 0:
                turtle.write(int(12), align="center", font=("Courier", 14, "bold"))
            elif i == 30:
                Skip(25)
                turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
                Skip(-25)
            elif (i == 25 or i == 35):
                Skip(20)
                turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
                Skip(-20)
            else:
                turtle.write(int(i / 5), align="center", font=("Courier", 14, "bold"))
            Skip(-radius - 20)
        else:
            turtle.dot(5)
            Skip(-radius)
        turtle.right(6)
 
 
def Week(t):
    week = ["星期一", "星期二", "星期三",
            "星期四", "星期五", "星期六", "星期日"]
    return week[t.weekday()]
 
 
def Date(t):
    y = t.year
    m = t.month
    d = t.day
    return "%s-%d-%d" % (y, m, d)
 
 
def Tick():
    # 繪製錶針的動態顯示
    t = datetime.today()
    second = t.second + t.microsecond * 0.000001
    minute = t.minute + second / 60.0
    hour = t.hour + minute / 60.0
    secHand.setheading(6 * second)
    minHand.setheading(6 * minute)
    hurHand.setheading(30 * hour)
 
    turtle.tracer(False)
 
    printer.forward(65)
    printer.write(Week(t), align="center",
                  font=("Courier", 14, "bold"))
    printer.back(130)
    printer.write(Date(t), align="center",
                  font=("Courier", 14, "bold"))
    printer.home()
    turtle.tracer(True)
 
    # 100ms後繼續調用tick
    turtle.ontimer(Tick, 100)
 
 
def main():
    # 打開/關閉龜動畫,併爲更新圖紙設置延遲。
    turtle.tracer(False)
    Init()
    SetupClock(160)
    turtle.tracer(True)
    Tick()
    turtle.mainloop()
 
 
if __name__ == "__main__":
    main()複製代碼
相關文章
相關標籤/搜索