Fork me on GitHub

經典Python實現的小項目,練手必備(一)

冒泡排序

算法描述

冒泡排序的基本思想就是:從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最后將最大的數據元素交換到了無序隊列的隊尾,從而成為有序序列的一部分;下一次繼續這個過程,直到所有數據元素都排好序。

算法的核心在于每次通過兩兩比較交換位置,選出剩余無序序列里最大的數據元素放到隊尾。

代碼實現

  • 比較相鄰的元素,如果第一個比第二個大(升序),就交換他們兩個;
  • 對每一對相鄰元素做同樣的工作,從開始第一對到結尾的最后一對;
  • 針對所有的元素重復以上的步驟,除了最后已經選出的元素;
  • 持續每次對越來越少的元素重復上面的步驟,直到沒有任何一對數字需要比較。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# _*_ coding:utf-8 _*_

# 冒泡排序
def bubble_sort(list):

n = len(list)
print(f"列表的總長度為:{n}")

for i in range(n - 1):

print('-' * 20)
print(f"當前i為:{i}")
count = 0
print('*' * 20)

for j in range(0, n-1-i):

print(f"當前j為:{j}")
print(list)

# 讓列表的前一位與后一位進行對比,如果前一位大于后一位,則交換兩者的位置,當最大的以為移至隊列尾部時停止比較
if list[j] > list[j+1]:

list[j], list[j+1] = list[j+1], list[j]
count += 1
print(f"當前count為:{count}")

if 0 == count:
break

if __name__ == '__main__':
list = [56, 12, 1, 8, 254, 456, 10, 100, 34, 56, 7, 23, 234, -57]
print(f"原列表為:{list}")
bubble_sort(list)
print('^' * 60)
print(f"新列表為:{list}")

最終結果為:

1
新列表為:[-57, 1, 7, 8, 10, 12, 23, 34, 56, 56, 100, 234, 254, 456]

插入排序

算法描述

插入排序的基本操作就是將一個數據插入到已經排好序的有序數據中,從而得到一個新的、個數加一的有序數據,算法適用于少量數據的排序,時間復雜度為O(n^2)。是穩定的排序方法。插入算法把要排序的數組分成兩部分:第一部分包含了這個數組的所有元素,但將最后一個元素除外(讓數組多一個空間才有插入的位置),而第二部分就只包含這一個元素(即待插入元素)。在第一部分排序完成后,再將這個最后元素插入到已排好序的第一部分中。

代碼實現

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# _*_ coding:utf-8 _*_

# 插入排序
def insert_sort(list):

n = len(list)
print(f"列表的總長度為:{n}")

for i in range(1, n):

print('-' * 40)
print(f"當前i為:{i}")
key = list[i]
print(f"當前key為:{key}")
j = i - 1
print(f"當前j為:{j}")

while j >= 0:

if list[j] > key:
print(f"因為list[j]:{list[j]}>key:{key},所以執行這一步")
print(f"list[{j+1}]={list[j+1]},list[{j}]={list[j]}")
# list[j + 1], list[j] = list[j], key

list[j+1] = list[j]
list[j] = key

print(f"list[{j}]:{list[j]},key:{key}")

j -= 1
print(f"當前j為:{j}")
print(f"當前list為:{list}")

# # return list

if __name__ == '__main__':
list = [56, 12, 1, 8, 254, 456, 10, 100, 34, 56, 7, 23, 234, -57]
print(f"原列表為:{list}")
insert_sort(list)
print(f"新列表為:{list}")

最終結果為:

1
新列表為:[-57, 1, 7, 8, 10, 12, 23, 34, 56, 56, 100, 234, 254, 456]

計算x的n次方

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def power(x, n):
s = 1
print(f"初始x為:{x}")
print(f"初始n為:{n}")
print('-' * 30)

while n > 0:
n -= 1
print(f"當前n為:{n}")
s = s * x
print(f"當前s為:{s}")
print('- ' * 10)

return s

計算axa+bxb+cxc+..

1
2
3
4
5
6
7
8
9
10
11
12
def clac(*numbers):

sum = 0

for n in numbers:
print(f"當前n為:{n}")
sum = sum + n * n
print(f"當前sum為:{sum}")
print('-' * 10)

print(sum)
return sum

計算階乘n!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# 方法一
def fac(num):
factorial = 1

if num < 0:
print("抱歉,負數沒有階乘")

elif num == 0:
print("0的階乘為1")

else:
for i in range(1, num + 1):
print(f"當前i為:{i}")
print(f"乘法流程為factorial[{factorial}]* i[{i}]")
factorial = factorial * i
print(f"當前factorial為:{factorial}")
print("- " * 10)

print(f"{num}!的階乘為{factorial}")

# 方法二
def factorial(n):

result = n

for i in range(1, n):
result *= i

print(result)
return result

# 方法三
def fact(n):
if n == 1:
return 1

m = n * fact(n - 1)
print(m)
return m

列出當前目錄下的所有文件和目錄名

1
2
3
4
5
6
def show_all_dir():
# for d in os.listdir('.'):
# print(d)
# d for d in os.listdir('.')就等于for d in os.listdir('.')
a = [d for d in os.listdir('.')]
print(a)

2中寫法,其中一種寫法注釋了。

把一個list中所有的字符串變成小寫

1
2
3
4
5
6
7
8
def word_lower(list):
# for i in list:
# i.lower()

list = [i.lower() for i in list]
# print(list)
# print(f"新列表為:{list}")
return list

輸出某個路徑下的所有文件和文件夾的路徑

1
2
3
4
5
6
7
8
9
10
def get_dir():
filepath = input(">>請輸入一個路徑:")
try:
if filepath == "":
print("請輸入正確的路徑!")
else:
for i in os.listdir(filepath):
print(os.path.join(filepath, i))
except:
print("路徑錯誤!請重新輸入!")

輸出某個路徑及其子目錄下的所有文件路徑

1
2
3
4
5
6
7
def show_dir():
filepath = input(">>請輸入一個路徑:")
for i in os.listdir(filepath):
path = (os.path.join(filepath, i))
print(path)
if os.path.isdir(path):
show_dir(path)

輸出某個路徑及其子目錄下所有以.html為后綴的文件

1
2
3
4
5
6
7
def show_dir_html(filepath):
for i in os.listdir(filepath):
path = os.path.join(filepath, i)
if os.path.isdir(path):
show_dir_html(path)
if path.endswith(".xml"):
print(path)

把原字典的鍵值對顛倒并生產新的字典

1
2
3
4
5
6
7
8
9
10
11
def get_dict():
dict1 = {
"A": "a",
"B": "b",
"C": "c",
"D": "d"
}

dict2 = {y:x for x, y in dict1.items()}

print(dict2)

打印99乘法表

1
2
3
4
5
6
def chengfa():
for i in range(1, 10):
for j in range(1, i + 1):
# print(f"{j} x {i} = {i*j}", end=' ')
# print('- ' * 20)
print('%d x %d = %d \t'%(i, j, i*j), end='')

替換列表中所有的3位3a

1
2
3
4
5
def tihuan(list):
for i in range(list.count(3)):
ele_index = list.index(3)
list[ele_index] = "3a"
print(list)

搖骰子小游戲

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def random_num():
i = 1
a = random.randint(0, 100)
print(a)
b = int(input(">>>請輸入0-100中的一個數字\n然后查看是否與電腦一樣:"))

while a != b:
if a > b:
print(f"你輸了,電腦贏了!中獎號為{a}")
b = int(input(">>>請再次輸入輸入數字:"))
else:
print(f"你贏了,中獎號為{a},你大于電腦輸入的!")
b = int(input(">>>請再次輸入輸入數字:"))

i += 1

else:
print("居然跟電腦輸入的數字一樣!")

隨機驗證碼

1
2
3
4
5
6
7
8
9
10
11
12
13
def yanzhengmasuiji():
str1 = "0123456789"

# string.ascii_letters包含所有字母(大寫與小寫)的字符串
str2 = string.ascii_letters
# print(str2)
str3 = str1 + str2
print(str3)

ma1 = random.sample(str3, 6)
print(ma1)
ma1 = ''.join(ma1)
print(ma1)

計算平方根

1
2
3
4
5
def num_genhao():
num = float(input(">"))
num_sqrt = num ** 0.5

print(num_sqrt)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
def is_numbers(s):
try:
float(s)
return True
except ValueError:
pass

try:
import unicodedata2
unicodedata.numberic(s)
return True
except (TypeError, ValueError):
pass

return False

判斷奇偶

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
def jiou():
# num = int(input(">請輸入一個數字:"))
# if (num % 2) == 0:
# print(f"{num}是偶數!")
# else:
# print(f"{num}是奇數!")

while True:
try:
num = int(input(">請輸入一個數字:"))
except ValueError:
print("輸入的不是整數!")
continue
if (num % 2) == 0:
print(f"{num}是偶數!")
else:
print(f"{num}是奇數!")

break

判斷閏年

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 方法一
def runnian():

year = int(input("請輸入一個年份:"))
if (year % 4) == 0:
if (year % 100) == 0:
if (year % 400) == 0:
print(f"{year}是閏年")
else:
print(f"{year}不是閏年")

else:
print(f"{year}是閏年")

else:
print(f"{year}不是閏年")

# 方法二
def runnian2():
import calendar

year = int(input("請輸入一個年份:"))
check_year = calendar.isleap(year)
if check_year == True:
print(f"{year}是閏年")
else:
print(f"{year}不是閏年")

獲取最大值

1
2
3
4
5
6
7
8
9
10
11
12
13
def whos_number_is_big():

n = int(input("請輸入需要對比大小數字的個數:"))

print("請輸入需要對比的數字:")

num = []
for i in range(1, n+1):
temp = int(input(f'>>>請輸入第{i}個數字:'))
num.append(temp)

print("輸入的數字為:", num)
print("最大值為:", max(num))

斐波那契數列

斐波那契數列指的是這樣一個數列:0,1,1,2,3,5,8,13;第1項為0,第2項為1,從第3項開始,每一項都等于前兩項之和。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
def feibonaqi():
n1 = 0
n2 = 1
nterms = int(input(">>>請輸入一個數:"))
if nterms <= 0:
print("請輸入一個大于1的正整數!")
elif nterms == 1:
print("請輸入一個大于1的正整數!")
else:
print("斐波那契數列:")
print(n1, end=",")

count = 0
while count < nterms:
# print(f"當前count為{count}")
nth = n1 + n2
print(n1 + n2, end=",")
n1 = n2
n2 = nth

count += 1

十進制轉二進制,八進制,十六進制

1
2
3
4
5
6
7
def shijinzhi():
dec = int(input("請輸入數字:"))

print("十進制數為:", dec)
print(f"轉化為二進制為:{bin(dec)}")
print(f"轉化為八進制為:{oct(dec)}")
print(f"轉化為十六進制為:{hex(dec)}")

求兩個數的最大公約數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 = i

return hcf

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

print(f"num1喝num2的最大公約數為:{hcf(num1, num2)}")

求兩個數的最小公倍數

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
def lcm(x,y):
if x > y:
greater = y
else:
greater = x

while(True):
if((greater % x == 0) and (greater % y == 0)):
lcm = greater
break

greater += 1

return lcm

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

print(f"num1喝num2的最最小公倍數為:{lcm(num1, num2)}")

簡單計算器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
def add(x, y):

return x + y

def subtract(x, y):

return x - y

def muliply(x, y):

return x * y

def divide(x, y):

return x / y

print("選擇運算:")
print("1.相加\n2.相減\n3.相乘\n4.相除")

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

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

if choice == '1':
print(f"{num1}+{num2}={add(num1,num2)}")
elif choice == '2':
print(f"{num1}-{num2}={subtract(num1,num2)}")
elif choice == '3':
print(f"{num1}*{num2}={muliply(num1, num2)}")
elif choice == '4':
if num2 != 0:
print(f"{num1}/{num2}={divide(num1,num2)}")
else:
print("分母不能為0")
else:
print("非法輸入!")

生成日歷

1
2
3
4
5
6
import calendar

yy = int(input(">>>請輸入年份:"))
mm = int(input(">>>請輸入月份:"))

print(calendar.month(yy, mm))

文件IO

1
2
3
4
5
6
7
8
9
10
def file_io():
with open("huixing.txt", "wt") as out_file:
out_file.write("該文本寫入到文件中\n看到我了吧!")

with open("huixing.txt", "rt") as in_file:
text = in_file.read()

print(text)

file_io()

字符串判斷

1
2
3
4
5
6
7
8
9
10
11
12
def str_test():
# str = "www.adokoy.icu"
str = "Liuyude"
print(str.isalnum()) # 判斷所有字符都是數字或者字母
print(str.isalpha()) # 判斷所有字符都是字母
print(str.isdigit()) # 判斷所有字符都是數字
print(str.islower()) # 判斷所有字符都是小寫
print(str.isupper()) # 判斷所有字符都是大寫
print(str.istitle()) # 判斷所有單詞都是首字母大寫,像標題
print(str.isspace()) # 判斷所有字符都是空白字符

print("-" * 40)

字符串大小寫轉換

1
2
3
4
5
6
def trans_str():
str = "https://liuyude.COM"
print(str.upper()) # 把所有字符中的小寫字母轉換成大寫字母
print(str.lower()) # 把所有字符串中大寫字母轉換成小寫字母
print(str.capitalize()) # 把第一個字母轉化為大寫字母,其余小寫
print(str.title()) # 把每個單詞的第一個字母轉化為大寫,其余小寫

計算每個月天數

1
2
3
4
def get_month_days():
import calendar
monthRange = calendar.monthcalendar(2019, 2)
print(monthRange)

獲取昨天的日期

1
2
3
4
5
6
7
def get_last_day():
import datetime
today = datetime.date.today()
oneday = datetime.timedelta(days=1)
yesterday = today - oneday
print(yesterday)
return yesterday

參考資料

30個常用Python實現,新手必備!

北斗预测