本博客原文地址:https://www.cnblogs.com/BobHuang/p/14341687.html,原文體驗更佳
如果你是一名浙江2020級及以后的高中生要學習Python,抑或是一位科學工作者要學習Python,抑或是一名熟悉C/C++想擴展自己的技術棧來學習Python,抑或是一位小朋友在學習Python,以下文章對你學習Python編程將非常有幫助。
天天快樂編程在線評測平台現有6000多題,且支持Python語言,各種層級題目均具備。所以這里以天天快樂編程TZOJ為例,帶您一起嘗試用Python刷在線評測平台(Online Judge),提升自己的編程技巧及解決問題的能力。天天快樂編程信息技術分類,以下文章所提到的題目均已按順序在此分類里。
一、Python語言簡介
Python由荷蘭數學和計算機科學研究學會的Guido van Rossum 於1990 年代初設計,也就是龜叔,順便一提,Van 這個姓氏代表是貴族后裔。
Python提供了高效的高級數據結構,還能簡單有效地面向對象編程。別人幫你造好了大樓,你拿來裝修后做什么是你的事情。Python是面向對象的語言,是一種抽象的軟件開發的思想方法,在Python里一切皆對象。
Python是解釋型語言,他會將將源代碼逐條轉換成目標代碼同時逐條運行。而C/C++等編譯型語言會一次性將代碼轉換為目標代碼,所以運行速度更快。最廣泛使用的Python解釋器是CPython,其是用C語言實現的Python解釋器。Python語法很多來自C,但是其又增添了一些語法規則,如強制縮進。
Python可以花更多的時間用於思考程序的邏輯,而不是具體的實現細節,所以受科研工作者深度熱愛。Python簡單易學,所以作為非計算機專業學生的入門語言也是非常友好的,不用擔心學不會。Python具有非常豐富的模塊,它可以幫助你處理各種工作。比如OCR識別,一行代碼,如pytesseract.image_to_string("sample.jpg"),即可完成對"sample.jpg"這個圖像文件的文字識別。使用幾行代碼能完成對表格的復雜處理。當然他的功能遠不如此,圖形界面開發、系統網絡運維、科學與數字計算均可用Python輕松完成。
Python取各語言之長,前面我們已經提到過其語法很多來自於C,其標准庫的正則表達式參考了Perl,而lambda, map, filter, reduce等函數參考了Lisp。
如果你是計算機專業,我建議你從C學起,老老實實將數據結構與算法學踏實,這對你學習Python將會非常有幫助。無論學習什么語言,算法都是編程的核心。
二、順序結構
1.輸出語句
1452: C語言實驗題――Hello World要求我們打個招呼,這句話也是學習每個編程語言的開始。我們想要讓程序顯示內容,需要使用對應的語句,Python對應的輸出語句為print("你要說的內容"),我們將你要說的內容換為你要說的話即可,中英文均可。
1452參考代碼
print("Hello, World!")
print函數格式:print(*objects,sep=' ',end='\n')
功能:可以一次輸出多個對象。多個參數(object復數)之間用逗號分割,輸出的多個對象之間的分隔符默認為一個空格,所有信息輸出之后添加的符號默認為換行符。
然后你可以划到頁面底部,點擊提交按鈕,然后將運行語言選擇為Python3,並將你的代碼粘貼進去,點擊提交后即可看到結果。
提交后顯示紅色的Accepted代表你通過了這個題目,綠色的Wrong Answer代表你寫錯了(有可能是大小寫錯誤,以及少了標點),藍色的Compile Error代表你寫的代碼沒有運行或者沒有將語言改為Python3,粉紅色的Presentation Error請檢查是否多了一個空格,或少了一個空格。
通過后你可以嘗試下以下題目
6977 輸出平台地址、6176 武漢加油!中國加油!、5980 抹布的水印、6903 tencent's 水題1 、6990 say sorry to teacher、6953 最優價錢問題
那如果要輸出三遍呢,比如5221: 重要的話說三遍,要求我們將I'm gonna WIN!說三遍,聰明的你可以嘗試一下。
5221參考代碼1
print("I'm gonna WIN!")
print("I'm gonna WIN!")
print("I'm gonna WIN!")
5221參考代碼2
print("I'm gonna WIN!\nI'm gonna WIN!\nI'm gonna WIN!")
5221參考代碼3
print("I'm gonna WIN!\n"+"I'm gonna WIN!\n"+"I'm gonna WIN!")
5221參考代碼4
print("I'm gonna WIN!\n"*3,end="")
通過后你可以嘗試下以下題目
6762 開心的yym、6942 給yym加油打氣、6962 打印任務
2.輸入語句
7182: 我的第一個程序輸入你的姓名,然后將輸出的姓名輸出到屏幕上顯示。輸出我們可以用print,那么輸入我們怎么做呢,可以使用input()語句。輸出空格需要我們控制,我們可以使用sep控制空格
7182參考代碼
# 用name保存輸入內容
name = input()
print("Hello,",name)
注釋
注釋主用於解釋程序代碼,目的是提升代碼的可讀性。在Python程序中,單行注釋以“#”開頭。注釋部分分會被編譯器略去,從而不被計算機執行。
input函數
格式:input([prompt])
功能:讀取從鍵盤輸入的字符串,若給定提示字符串(參數prompt),則直接輸出。
變量是指其值在程序執行過程中會發生變化的量,它一般需要先定義在使用,比如上面我定義了name變量將輸入的名字保存了下來。
賦值語句
賦值語句是最基本的語句,它的作用就是將表達式的值賦給變量。
格式:變量名=表達式。其中“=”為賦值號
功能:把賦值號右邊表達式的計算結果,存儲到賦值號左邊的指定的變量中。
在Python中,給變量命名,要遵循以下規則:
1)只能包含字母、數字和下划線。注意字母區分大小寫。注:Python3支持中文變量名,但不建議使用
2)不能以數字開頭,不能與關鍵字同名。
通過后你可以嘗試下以下題目
5600 打招呼、5877 輸出第二個數、5681 簡單輸入輸出、6933 演講打招呼、6439 字符菱形
5681提示: 簡單輸入輸出需要讀入多個元素,設置多個變量依次讀入並輸出。
5681參考代碼
name = input()
age = input()
NO = input()
print("name:",name,sep='')
print("age:",age,sep='')
print("NO:",NO,sep='')
3.簡單計算
1001: 整數求和給我們兩個數字,要讓我們對他們進行求和。
如果我們讀入后直接將a+b,他會輸出兩個數字相連接,比如1和2,會輸出12。
1001錯誤代碼
a=input()
b=input()
print(a+b)
那么如何讓其輸出3呢。數據具有不同的類型,不同的類型也對應不同的特征,input得到的類型為字符串類型。
Python的常用數據類型--表示數字
數據類型名稱 | 數據表示形式 |
---|---|
整形(int) | 數學中的整數,如0,1,-2等 |
浮點型(float) | 數學中的小數,如2.0,3.14,-6.8等 |
本題我們要計算兩個整數的和,我們可以用int()將其轉換為對應的類型。
Python常用的數據類型轉換函數
int([x]):將字符串或者數字轉換為整數。
float([x]):將字符串或數字轉換為浮點數。
例如: >>> float("25")
25.0
1001參考代碼1
a=input()
b=input()
print(int(a)+int(b))
1001參考代碼2,更建議讀入后就進行轉換
a=int(input())
b=int(input())
print(a+b)
通過后你可以嘗試下以下題目
6442 bth之潘家小鎮3 、6783 三角形的周長、6779 CJC的取信問題、5974 多大了
4.復雜數字計算
除了可以進行加減運算外,四則運算的中乘除也是可以的,乘號用的是"*",位於數字8的上方,除號用的是"/",位於右shift的左側。
Python常用算數運算符
運算符 | 表達式 | 描述 | 示例 | 優先級 |
---|---|---|---|---|
+ | x+y | 將x與y相加 | 5+2結果為7 | 3 |
- | x-y | 將x減去y | 5-2結果為3 | 3 |
* | x*y | 將x與y相乘 | 5*2結果為10 | 2 |
/ | x/y | 將x除以y,結果為浮點數 | 5/2結果為2.5 | 2 |
// | x//y | 將x除以y,取整數部分 | 5//2結果為2 | 2 |
% | x%y | 將x除以y,求余數 | 5%2結果為1 | 2 |
** | x**y | 求x的y次冪 | 5**2結果為25 | 1 |
注意:1.Python的除法規則和其他語言不一樣。2.需要提高優先級請使用()
5887: 長方形的周長,長方形周長為(長+寬)*2
5887參考代碼
a=int(input())
b=int(input())
print((a+b)*2)
通過后你可以嘗試下以下題目
6904 tencent's 水題2、7131 圓的直徑、6780 CJC的生產垃圾問題、6874 買東西、6659 bth的鐵絲問題、6634 bth的數學問題
1494: C語言實驗題――溫度轉換要求給定一個華氏溫度,輸出攝氏溫度。
本題輸入為小數,所以類型為float,但是要求我們保留兩位小數,這里可以用C語言的格式控制%.2f,之后跟上變量名稱
格式化函數format()
格式:format(value[,fomat_spec])。
功能:將數據按foramt_spec格式規划表現形式。例如,浮點數格式[width].[.precision]表示寬度和精度
例如: >>> x=26.6666666666666668
>>> printf(fomat(x,'.2f'))
26.67
1494參考代碼1
F=float(input())
print(format(5*(F-32)/9,'.2f'))
也可以使用C語言的語法
1494參考代碼2
F=float(input())
print('%.2f'%(5*(F-32)/9))
其他格式化參數
d 以十進制形式輸出帶符號整數(正數不輸出符號)
o 以八進制形式輸出無符號整數(不輸出前綴O)
x 以十六進制形式輸出無符號整數(不輸出前綴OX)
u 以十進制形式輸出無符號整數
f 以小數形式輸出浮點數
e 以指數形式輸出浮點數
g 以%f%e中較短的輸出寬度輸出浮點數
c 輸出單個字符
s 輸出字符串
標志字符為-、+、#、空格四種,其意義:
- 結果左對齊,右邊填空格
+ 輸出符號(正號或負號)空格輸出值為正時冠以空格,為負時冠以負號
\# 對c,s,d,u類無影響;對o類, 在輸出時加前綴。對x類,在輸出時加前綴0x;對e,g,f 類當結果有小數時才給出小數點
輸出的格式控制
%nd n為指定的輸出字段的寬度。如果數據的位數小於n,則左端補以空格,若大於n,則按實際位數輸出。
%0nd n為指定的輸出字段的寬度。如果數據的位數小於n,則左端補以0,若大於n,則按實際位數輸出。
%m.nf:輸出共占m列,其中有n位小數,如數值寬度小於m左端補空格。
通過后你可以嘗試下以下題目
7133 圓的周長、7132 圓的面積、5972 單位轉換、7020 溫度轉換1、6784 溫度轉換2、6969 溫度轉換3、6970 溫度轉換4、6971 溫度轉換5
如果多個變量呢,如2982: 圓的直徑、周長和面積這一題,我們可以一個一個輸出
2982參考代碼
PI=3.1415926
r=float(input())
d=2*r
circle=2*PI*r
area=PI*r**2
print("%.2f"%d,"%.2f"%circle,"%.2f"%area)
通過后你可以嘗試下以下題目
6143 單位轉換、1493 C語言實驗題――圓柱體計算
5884: 帶余除法"/"可以求出小數商(得到的為浮點型),Python中還有求商的整數部分,為//。被除數/除數=商···余數,求余數可以直接用取余運算符%。
Python不管同號還是異號,都會讓商盡量小,所以14//-6的值為-3,余數為-4
5884參考代碼
a=int(input())
b=int(input())
print(a//b,a%b)
通過后你可以嘗試下以下題目
1488 C語言實驗題――買糖果、6785 3位數的每一位、6013 反向輸出一個三位數、4562 合並正整數
接下來我們可以嘗試下6781: 算數平方根,開根號對應為0.5次冪,使用**冪運算符即可。
6781參考代碼
a=float(input())
print('%.2f'%(a**0.5))
通過后你可以嘗試下以下題目
5886 計算2的冪、6859 乘方計算、5973 移動小數點、1491 C語言實驗題――三角形面積
5.字符
"Hello, World!","www.tzcoder.cn","0"都是字符串,字符串表示一串字符。那什么是字符呢。
字符是電子計算機或無線電通信中字母、數字、符號的統稱。計算機不能直接顯示字符,字符存儲在計算機中經過一定的規則編碼后的二進制數字,最終會被顯示為字符。
常見的編碼為ASCII碼,即美國信息交換標准代碼(American Standard Code for Information Interchange),字符和數字值一一對應的。
ASCII表,建議收藏。
常用的有空格為32,'0'為48,'A'為65,'a'為97,'A'與'a'相差32。
5885: ASCII表 要求輸入一個除空格以外的可見字符,輸出其ASCII碼。
讀入為一個字符,想要獲取其ASCII碼,字符型->整型可以用ord函數。
ord()函數
ord函數以一個字符(長度為1的字符串)作為參數,返回對應的 ASCII 數值,或者 Unicode 數值
5885參考代碼
a=input()
print(ord(a))
C語言的強制轉換在Python里得不到其ASCII碼,因為Python里一切皆對象,他會嘗試把字符串對象轉換為整型對象,如果是字母即轉換出現異常。
ASCII碼中沒有中文,我們中文使用的是GBK國標碼。為了適配多種語言,互聯網使用的是Unicode萬國碼。
必修1 P18使用UltraEdit軟件查看了"中國China"的字符內碼,在Python中也可以編程來看
查看內碼參考代碼
a='中國China'
a=a.encode('gbk')
for i in a:
print("%02X" % i)
5889: 打印字符 輸入一個整數,即字符的ASCII碼,輸出相對應的字符。
讀入ASCII碼,獲取字符,整型->字符型可以用chr函數。
chr函數
chr() 用一個范圍在256內的整數作參數,返回一個對應的字符。
5889參考代碼
# 注意輸入的類型為int
a=int(input())
print(chr(a))
通過后你可以嘗試下以下題目
7178 小z與ASCII加密、6446 小z與ASCII解密、1492 C語言實驗題――大小寫轉換、1489 C語言實驗題――字符編碼
4960: 打印圖形 要求我們打印一個字符的長方形。
每行分別print即可。但是如果你字符串的界定符用了''',那你的代碼將無法運行,需要使用'''進行轉義
4960參考代碼1
print("abcdefghij")
print("klmnopqrst")
print("uvwxyz+-*/")
print("0123456789")
print("()[]{}&&||")
print("!?:,><\^%'")
4960參考代碼2
print('abcdefghij')
print('klmnopqrst')
print('uvwxyz+-*/')
print('0123456789')
print('()[]{}&&||')
print('!?:,><\^%\'')
轉義字符
轉義字符 | ASCII 碼 | 轉義字符的含義 |
---|---|---|
\n | 10 | 回⻋換行 |
\t | 9 | 制表符 |
\\ | 92 | 反斜線符"" |
' | 39 | 單引號符 |
" | 34 | 雙引號符 |
我門使用這些特殊字符時往往要使用其轉義字符。
通過后你可以嘗試下以下題目
5074 打印字符、7042 最澄澈的空與海
6.字符串和列表
數據類型名稱 | 數據表示形式 |
---|---|
字符串型(str) | 用引號作為定界符,如'ABC',"請輸入"等 |
列表(list) | 用方括號作為定界符,如[1,2,3],[1,'a']等 |
字符串是字符的序列表,由一對引號(單引號或雙引號)構成。可以通過索引訪問字符串中特定位置的字符。
字符串和列表的索引(下標)從0開始,想要訪問a中的第1個元素可以用a[0]訪問([]為索引運算符)。之后的元素依次往后數。
如“ABCDEFGHIJ”的索引標號如下所示
字符 | A | B | C | D | E | F | G | H | I | J |
---|---|---|---|---|---|---|---|---|---|---|
索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
7165: 列表索引問題簡單版1 要求我們輸出字符串的第5個元素。
第5個元素對應索引4,即[4]。
7165參考代碼
a=input()
print(a[4])
通過后你可以嘗試下以下題目
7166 列表索引問題簡單版2
Python存在正索引,同時也存在負索引,負索引就代表倒數第幾個。
字符 | A | B | C | D | E | F | G | H | I | J |
---|---|---|---|---|---|---|---|---|---|---|
正索引 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
負索引 | -10 | -9 | -8 | -7 | -6 | -5 | -4 | -3 | -2 | -1 |
7167: 列表索引問題簡單版3 要求我們輸出倒數第5個元素。
倒數第五個元素對應索引為-5,即[-5]。
7167參考代碼1
a=input()
print(a[-5])
能不能用正索引做呢,當然可以,我們可以量出字符串的長度l,倒數第5個,即[l-5]
len()函數
函數格式:len(s)
函數功能:返回序列s的長度或項目個數
7167參考代碼2
a=input()
l=len(a)
print(a[l-5])
通過后你可以嘗試下以下題目
7168 列表索引問題簡單版4
*7.字符串和列表的切片
此知識點量力而行,可能會有些困難。
有的時候我們可能需要列表中間隔幾個的項,我們可以用切片去完成。
格式:[start: end: step]
功能:返回從索引位置start到索引位置end且以step為步數的子序列(不包含索引位置end的元素)
例如:若lst=['HUAWEI','OPPO','VIVO','XIAOMI'],則lst[-3:-1]返回值是['OPPO','VIVO']。
你可以嘗試下以下題目
7169 字符串切片1、7170 字符串切片2、7171 字符串切片3、7172 字符串切片4、7173 字符串切片5、7174 字符串切片6、7175 字符串切片7
三、選擇結構
和之前順序結構不同,有時候我們需要有選擇執行某些語句,比如“如果明天下雨,那么明天就不去公園了”;“如果出門前告訴媽媽,那么她不會擔心我們;否則她會非常擔心我們”也就是if條件語句。其語法結構如下所示
if <條件> :
<語句塊1>
[else:
<語句塊2>]
if條件語句由if關鍵字構成,后面跟一個條件和一個冒號。冒號的作用是告知接下來要創建一個新的語句塊,處於同一縮進位置的代碼塊組成一個語句塊。
Python 關系表達式
關系表達式指用關系運算符,連接兩個類型相同的數據組成的表達式。關系表達式的值是布爾型。
| 數據類型名稱 |數據表示形式 |
|布爾型(bool)|只有兩種值:True和False,即真和假,也就是成立或不成立|
Python常見的關系運算符
關系運算符 | 表達式 | 描述 | 優先級 |
---|---|---|---|
>,< | x>y,x<y | x大於y,x小於y | 4 |
>=,<= | x>=y,x<=y | x大於等於y,x小於等於y | 4 |
==,!= | x==y,x!=y | x等於y,x不等於y | 4 |
in | x in y | x是y的成員 | 5 |
1.選擇結構的簡單應用
6810: 兩個數較大,給定兩個數讓我們求較大的。
6810參考代碼
a=int(input())
b=int(input())
if a>b:
print(a)
else:
print(b)
通過后你可以嘗試下以下題目
6811 兩個數較小、6774 求絕對值、6798 最外圍人數、6772 吃香蕉、5354 階梯電價、6837 區間測速、6833 停車場車位探測中的算法、6834 一元二次方程是否有實數根、5892 蘋果和蟲子
2.邏輯運算符的使用
6812: Alice的登錄賬號密碼需要我們一個程序去檢驗其賬號和密碼。要同時滿足賬號和密碼都是對的,這個可以用什么呢,可以用邏輯表達式中的與。
Python 邏輯表達式
邏輯表達式指用邏輯運算符,把邏輯變量連接起來的表達式。邏輯表達式的值仍是布爾型:真或假(True或False),真對應1,假對應為0。
Python常見的邏輯運算符
邏輯運算符 | 表達式 | 描述 | 優先級 |
---|---|---|---|
and | x and y | x且y | 7 |
or | x or y | x或y | 8 |
not | not x | 非x | 6 |
與其他編程語言不同的是, and中含False,返回False; 均為非False時,返回后一個值。or中, 至少有一個為非False時,返回第一個非False值。
所以本題直接將兩個條件並列起來即可。
6812參考代碼
user = input()
pwd = input()
if user == "admin" and pwd=="Python@16":
print("Login successful")
else:
print("Username or password is wrong")
可以嘗試下1485: C語言實驗題――整除,整除也就是取余后為0。
1485參考代碼
x = int(input())
if x % 3 ==0 and x % 5 == 0:
print('Yes')
else:
print('No')
6766: 三角形判斷,三角形滿足兩邊之和大於第三邊,所以我們需要把三個條件全都判斷一下即可。
6766參考代碼
a=int(input())
b=int(input())
c=int(input())
if a+b>c and b+c>a and a+c>b:
print("1")
else:
print("0")
我們來看一下6763: 收集瓶蓋贏大獎,滿足一個條件即可。需要運算我們邏輯運算符的or。
6763參考代碼
a=int(input())
b=int(input())
if a>=10 or b>=20:
print("1")
else:
print("0")
通過后你可以嘗試下以下題目
6765 判斷是否為兩位數、5893 晶晶赴約會、6767 點和正方形的關系、6435 判斷是否存在重復的數、6766 三角形判斷、6793 三角形判斷2
3.向上取整和向下取整
6445: 小z游東湖,大船可以乘6人,小船可以乘4人, x 人准備一起划船,最少需要多少條船。首先會選擇大船,因為大船坐人多。余1~4可以選1條小船,余5人可以選1條大船。這個題目不關心你選的大船還是小船,所以只需要有人剩下就選擇一條大船就可以了。
6445參考代碼1
a=int(input())
if a%6==0:
print(a//6)
else:
print(a//6+1)
當然我們也可以用roud函數進行向上取整,如果給定為小數,那么將其+0.5之后四舍五入即可。
函數格式:round(number)。
函數功能:返回浮點數number的四舍五入值。
6445參考代碼2
a=int(input())
ans=a/6
if ans==int(ans):
print(int(ans))
else:
print(round(ans+0.5))
6792: 出租車收費3千米以內(含3千米)收費10元,超過3千米的部分每千米收費2元(不足1km按1km算)。給定行駛路程s,問我們費用y。
首先這是一個分段函數,需要將其分成s<=3和s>3的情況。
我們可以根據以上式子轉換為代碼
6792參考代碼1
s=float(input())
#向上取整
if int(s)!=s:
s=round(s+0.5)
#計算金額
if s<=3:
m=10
else:
#由於s可能是浮點數,所以這里不轉換,輸出需要轉換一下
m=10+(s-3)*2
print(int(m))
+0.5比較雞肋,不是整數直接+1寫起來更簡單
6792參考代碼2
s=float(input())
#向上取整
if int(s)!=s:
s=int(s)+1
else:
# 缺少這步會wa,因為如果是整數你的類型不對
s=int(s)
#計算金額
if s<=3:
m=10
else:
m=10+(s-3)*2
print(m)
通過后你可以嘗試下以下題目
6651 bth的工程問題、6632 candy媽媽分油、6587 計算分段函數、6768 計算郵資、6845 星期幾問題
4.多分支語句
除了直接的if else,我們還可以使用elif,也就是在else中繼續寫條件。
if <條件> :
<語句塊1>
elif <條件2>:
<語句塊2>
···
elif <條件n>:
<語句塊n>
[else:
<語句塊2>]
5908: 三個數的最大值 給定3個數,請你幫忙求出最大值。
我們設3個數依次為a,b,c,三個數要么a最大,要么b最大,要么c最大。
a最大需要滿足什么條件呢?a>b且b>c
如果a不是最大,b最大需要滿足什么條件呢?b>a且b>c,即然a已經不是最大了,那么直接b和c就可以了,條件可以簡化為b>c
a、b都不是最大,那么c就是最大值了,我們可以將如上邏輯寫為代碼
5908參考代碼1
a=int(input())
b=int(input())
c=int(input())
if a>b and a>c:
print(a)
elif b>c:
print(b)
else:
print(c)
如果是10個數要比大小呢?這個判斷也太復雜了,我們可以嘗試簡化下邏輯。
我們默認第一個數為最大值,然后再讓第二個數與最大值比較,如果比最大值還大說明第二個數為最大值,這時候最大值為前兩個數的最大值,依次類推即可。
5908參考代碼2
a=int(input())
b=int(input())
c=int(input())
max_value=a
if b>max_value:
max_value=b
if c>max_value:
max_value=c
print(max_value)
通過后你可以嘗試下以下題目
5909 三個數的最小值、4590 最大值-最小值、1463 C語言實驗題――相加和最大值、6153 優惠方案選擇、6821 運動會名次、6823 空氣質量查詢、6822 浙江省汽車牌號所在地查詢
5.邏輯運算符的組合
閏年很熟悉吧,四年一閏,百年不閏,四百年又閏。所以閏年滿足什么條件呢,如果是4的倍數可能是閏年,但是世紀年不是閏年,而且四百的倍數是閏年。
所以滿足是4的倍數而且不是100的倍數就是閏年,但是如果是400的倍數也是,也就是條件的嵌套,我們可以使用elif語句。
6773: 閏年判斷 給定年份讓我們判斷閏年。
6773參考代碼1
year = int(input())
if year % 4 == 0 and year % 100 != 0:
print(1)
elif year % 400 == 0:
print(1)
else:
print(0)
當然兩個的閏年條件我們可以合並,and的優先級高於or的優先級,可以不用()
6773參考代碼2
year = int(input())
if year % 4 == 0 and year % 100 != 0 or year % 400 == 0:
print(1)
else:
print(0)
通過后你可以嘗試下以下題目
6764 有一門課不及格的學生、6849 圖書優惠問題、5978 公平分配、3712 自動門控制
四、循環結構
1.for循環
7179: 輸出字符串的各個字符 要求我們輸出字符串內各個字符。
長度也不長,用len()函數量出長度分別寫嗎?也太累了!計算機最擅長的事情就是循環,計算機1秒可以運行10億次,我們我們本題需要使用循環完成。
for 循環語句是通過遍歷某一序列對象來構建循環,循環結束的條件就是對象遍歷完成。for 循環語句的一般格式是:
for <變量> in <序列>:
<循環體>
[else:
語句塊]
執行過程:
<變量>每經過一次循環,就會得到序列中的一個元素,並通過循環體處理它。
<序列>通常是字符串、列表、range 對象實例等。當序列中的元素全部遍歷完時,程序就會自動退出循環,繼續執行 else 子句的語句塊。
7179參考代碼1
s=input()
for i in s:
print(i)
Python里還有range()函數來控制循環次數。
格式:range([start,]stop[,step])。
功能:創建一個整數列表。
參數:起始值(缺省值為0),終值(但不包括),步長(缺省為1)。
4734: C語言循環水題1 我們用range來完成下4734吧,即range(1,n+1)
4734參考代碼
n=int(input())
for i in range(1,n+1):
print(i)
那能否用利用len()函數輸出字符串的各個字符呢,當然也是可以的,量出長度n,range(n)即可
7179參考代碼2
s=input()
n=len(s)
for i in range(n):
print(s[i])
通過后你可以嘗試下以下題目
5954 輸出1到n中的奇數、5955 輸出1到n中的偶數、5956 輸出a與b之間的所有奇數、6776 Alice的幸運數、6778 開心的yym 2.0、6871 jjy之5.20、6912 感慨的yym
5951: 求1到n的和 要求我們求1~n的和,我們需要設置個袋子,比如sum_value用來記錄總和,4734我們將每個元素輸出,現在我們需要把他們全部加起來。
5951參考代碼
n=int(input())
sum_value=0
for i in range(1,n+1):
sum_value=sum_value+i
print(sum_value)
通過后你可以嘗試下以下題目
5952 求1到n中的奇數的和、5953 求1到n中的偶數的和、5894 被17整除
4735: C語言循環水題2 倒着按序輸出1到n內的所有整數。
和切片有點類似哦,我們需要把range的step設為-1,即range(n,0,-1)
4735參考代碼
n=int(input())
for i in range(n,0,-1):
print(i)
通過后你可以嘗試下以下題目
6856 倒着輸出1到n中的奇數、5958 倒着輸出1到n中的偶數、5957 倒着輸出a與b之間的所有偶數
2.for循環的實際運用
6975: 小z的賬單 現在有個賬單需要我們去統計下最終盈余。
我們需要讀入n次數據,我們在循環內讀入並將其加入sum_value即可。range(n)即可完成n次循環。
6975參考代碼
n=int(input())
sum_value=0
for i in range(n):
x=int(input())
sum_value=sum_value+x
print(sum_value)
通過后你可以嘗試下以下題目
6835 超市收銀系統、3296 漢堡包、6641 壓歲錢
5895: 1、5、10 要求我們統計n個數中1、5、10的個數。
我們可以設置3個num(個數)用來統計個數,符合就+1。
5895參考代碼
n=int(input())
num1=0
num2=0
num3=0
for i in range(n):
x=int(input())
if x==1:
num1=num1+1
if x==5:
num2=num2+1
if x==10:
num3=num3+1
print(num1,num2,num3,sep="\n")
通過后你可以嘗試下以下題目
5222 奇偶分家、6438 與指定數字相同的數的個數
1459: 求最大值 這個題就需要使用我們3個數最大值那個思路了。
假設第一個數為最大值,之后n-1個數一一比較,如果比最大值大,就把它換為最大值,相當於每次都和最大值比較。
可以把第一個數在循環里特殊處理
1459參考代碼1
n = int(input())
for i in range(n):
x = int(input())
if i==0:
max_value = x
elif x>max_value:
max_value = x
print(max_value)
也可以把第一次單獨列出來,之后循環n-1次進行比大小
1459參考代碼2
n = int(input())
max_value = int(input())
for i in range(n-1):
x = int(input())
if x>max_value:
max_value = x
print(max_value)
通過后你可以嘗試下以下題目
7180 求最小值、6836 新年大合唱比賽得分
5886: 計算2的冪 2的n次方代表n個2相乘,那我們循環n次,每次乘2就可以了。那么2的0次方呢,任何數的0次方都等於1,那么*2就正好不會出錯了,遇到需要相乘的,sum_value需要初始化為1。
5886參考代碼
n=int(input())
sum_value=1
for i in range(n):
sum_value=sum_value*2
print(sum_value)
通過后你可以嘗試下以下題目
6859 乘方計算、5973 移動小數點、6732 階乘、6860 求小數的某一位
6844: 設備價格問題 已知從第2年到第6年,每年初的價值比上年初減少10萬元;從第7年開始,每年初的價值為上年初的75%。
我們循環年份,將其分為兩段即可。
6844參考代碼
s=120
n=int(input())
for i in range(2,n+1):
if 2<=i<=6:
s=s-10
if i>=7:
s=s*75/100
print("%.2f"%s)
通過后你可以嘗試下以下題目
6824 數麥粒、6862 反彈高度
3.while循環及其實際應用
for針對固定次數的循環,有的時候循環次數不確定,我們可以使用while循環。
while 循環,又稱為條件循環。while 循環語句的一般格式如下:
while <條件> :
<循環體>
[else:
語句塊]
當條件判斷為 True 時,循環體被重復執行,當條件判斷為 False 時退出循環,else 子句的語句塊才會被執 行。若條件表達式的值一直為True,則 while 循環將一直執行。因此,在循環體中一定要包含改變測試條件的語句,使循環能夠結束,以避免死循環。
使用for輸出1~20
參考代碼
for i in range(1,21):
print(i)
使用while循環輸出1~20
i=1
while i<21:
print(i)
i=i+1
猜數游戲
在給定某數后,讓用戶輸入數進行猜測,計算機給出相應提示,如偏大、偏小或正確。若所猜測的數正確,則輸出猜測次數,否則繼續猜數。
猜數游戲參考代碼
num=66
i=0
while True:
guess=int(input("請輸入猜測的數:"))
if guess<num:
print("偏小")
i=i+1
elif guess>num:
print("偏大")
i=i+1
else:
print("正確,共猜測次數:",i+1)
break
當然我們可以隨機一個數,讓他變得更有趣。random模塊可以隨機數字
import random
# 隨機生成一個[1,100]的整數
num=random.randint(1,100)
循環控制語句
循環控制語句主要有 break 和 continue
- break語句
功能:跳出當前循環,不再判斷執行循環的條件是否成立。 - continue語句
功能:結束當前的當次循環,但不跳出當前循環,繼續判斷執行循環的條件是否成立。
6825: 儲蓄問題 已知某同學有一些零用錢,他想通過銀行儲蓄增值。問:存多少年,才能達到預期的數額?
下一年錢=本金+利息=本金+本金*利率,所以我們可以將獲得錢做為條件
6825參考代碼
i=0
p=float(input())
q=float(input())
while p<q:
p=p+p*0.03
i=i+1
print(i)
通過后你可以嘗試下以下題目
6843 城市人口問題、5006 害死人不償命的(3n+1)猜想
4.二重循環
5400: 打印乘法表 要求我們打印n*n的乘法表
乘法表第1行1列,第2行2列,...,第9行9列,第i行i列,輸出必須從上到下,從左到右,所以我們要一行一行輸出。
每一行第一個數依次遞增,第二個數為行數,所以循環變量i為行,j為列控制即可。
制表符為'\t',這個題需要特別控制,由於兩個之間有一個制表符。我們可以將問題簡化為第一個式子正常輸出,第二個式子之后先輸出制表符之后輸出式子,即在循環里判斷下即可。
5400參考代碼1
n=int(input())
for i in range(1,n+1,1):
for j in range(1,i+1,1):
if j!=1:
print("\t",end="")
print(j,'*',i,'=',i*j,sep="",end="")
print()
通過后你可以嘗試下以下題目
1457 C語言實驗題――求一個3*3矩陣對角線元素之和、3064 判斷閏年
5.打印圖形
7181: 漂亮菱形簡易版
循環分兩部分,分別輸出上下
上下對稱,上部分輸出好,行倒着輸出下半部分。
上部分空格依次為4,3,2,1,即n//2+1-x
上部分*依次為1,3,5,7,9,即(2*x-1)
下半部分循環逆置
7181參考代碼1
n = int(input())
for x in range(1,n//2+1+1):
print(' '*(n//2+1-x),end='')
print('*'*(2*x-1))
for x in range(n//2,0,-1):
print(' '*(n//2+1-x),end='')
print('*'*(2*x-1))
輸入n輸出n行。
第一行有4個空格,第二行有3個空格,第三行有2個空格,第四行有1個空格,第五行有0個空格,第六行有1個空格,第七行有2個空格,第八行有3個空格,第九行有4個空格
我們設空格個數為y,行號為x,當n為9時*可以列方程求解為\(y=|5-x|\) ,5為(n+1)/2求得
同理可以求得*個數的表達式為\(y=n-|n+1-2*x|\)
7181參考代碼2
n = int(input())
for x in range(1,n+1):
print(' '*abs((n+1)//2-x),end='')
print('*'*(n-abs(n+1-2*x)))
通過后你可以嘗試下以下題目
1172 C語言實驗題――打印菱形、5970 打印長方形、6145 打印平行四邊形、6319 Alice與字母K、6498 2021加油、1177 C語言實驗題――打印數字圖形
五、枚舉
在很多時候,由於人類大腦的運算和處理能力相對有限,無法立刻得出某個問題的可能解或最優解,如復雜密碼的破解。但是,人們可以利用計算機運算速 度快和存儲容量大的特點,采用最原始的破解方法——枚舉法。
6842: 整數的因子 給定整數n求其因子。
因子只能是1到它本身,我們可以依次遍歷,如果是(n%i==0)則輸出。
6842參考代碼
n=int(input())
for i in range(1,n+1):
if n%i==0:
print(i)
通過后你可以嘗試下以下題目
6788 找數字、6628 回文之99倍數、6847 韓信點兵、6855 尋找水仙花數、
百錢買雞
我國古代數學家張丘建在《算經》中提出了如下的數學問題:雞翁一,值錢五;雞母一, 值錢三;雞雛三,值錢一;百錢買百雞,問翁、母、雛各幾何?
意思就是:公雞五文錢一只,母雞三文錢一只,小雞三只一文錢,用100文錢買 100只雞,公雞、母雞、小雞各買多少只?
設公雞有 x 只、母雞有 y 只,小雞有 z 只。根據題意,若全部買公雞,則最多可以買 \(\frac{100}{5}\)只,因此 x 的取值范圍為 0 ≤ x ≤ 20 ;若全部買母雞,則最多可以買 \(\frac{100}{3}\) 只,因此 y 的取值范圍為 0 ≤ y ≤ 33 ;若全部買小雞,則最多可以買 100×3只,但雞總共只有 100 只,因此 z 的取值范圍為 0 ≤ z ≤ 100 。
枚舉公雞只數x,母雞只數y,小雞只數為(100-x-y),判斷\(5x+3y+ \frac{1}{3}(100 - x - y)=100\)即可
百錢買雞參考代碼
count=0 #循環計數
for x in range(21):
for y in range(34):
count = count + 1
if 5*x+3*y+(100-x-y)/3==100:
print("公雞:",x,"母雞:",y,"小雞:",100-x-y)
print("循環運行次數:",count)
枚舉算法總結
基本思想是把問題所有的可能解一一列舉出來,並判 斷每一個列舉出的可能解是否為正確的解。枚舉算法的步驟:
(1)確定枚舉對象、范圍和判定條件。
(2)逐一枚舉可能的解,並驗證每個解是否為問題的解。
通過后你可以嘗試下以下題目
6854 n錢買百雞、6449 小z與直角三角形、6829 零錢兌換、6830 尋找完全數、2779 明明的幸運數
六、模擬
6741: 動動有獎 有1個非常復雜的規則領取錢,我們可以分別考慮。
1.先考慮規則1
每天走路的前1000步獎勵0.3金,之后每2000步獎勵0.1金(不足2000步沒有獎勵),每天最高獎勵不超過3金。
可以寫出如下代碼
6741規則1參考代碼
if x>=1000:
t=0.3+((x-1000)//2000)*0.1
if t>3:
t=3
else:
t=0
2.再考慮規則2
每天必須到計步器頁面點擊“領獎”按鈕,才能領取昨日走路獎金。
我們可以設置個f進行讀入
6741規則2參考代碼
if f==1:
if x>=1000:
t=0.3+((x-1000)//2000)*0.1
if t>3:
t=3
else:
t=0
else:
3.考慮規則3
如果連續3天領獎成功,從第4天起走路獎金翻1倍(乘以2),每天最高獎勵不超過6金。翻倍期間若有1天沒有領獎(即連續每天領獎行為中斷),則翻倍權益取消,重新連續3天領獎成功才能繼續翻倍。
我們可以設置一個c代表簽到天數
6741規則3參考代碼1
if f==1:
...
else:
c=0
f=1,連簽簽到天數+1,否則歸零。
+t之前進行判斷
連簽每天最高獎勵不超過6金,和規則1每天最高獎勵不超過3金重復,可以不用判斷。
6741規則3參考代碼2
c=c+1
if c>=4:
s=s+2*t
else:
s=s+t
自然語言描述
①輸入總天數n
②表示天數的變量i初始化為1
③若i≤n,則轉④,否則轉⑦。
④輸入第i天的數據(包括第i天走路步數X;,是否成功領取第i天“獎金”的標
記F;)
⑤根據當前輸入的數據Ⅹ,F,統計該天領取的獎金並累加到總獎金 total中。
⑥表示天數的變量i增加1,然后轉③。
⑦輸出變量 total的值。
6741參考代碼
n = int(input())
s,c = 0,0
for i in range(n):
x,f=map(int,input().split())
if f==1:
if x>=1000:
t=0.3+((x-1000)//2000)*0.1
if t>3:
t=3
else:
t=0
c=c+1
if c>=4:
s=s+2*t
else:
s=s+t
else:
c=0
print("%.1f"%s)
通過后你可以嘗試下以下題目
6744 條形碼、6848 籃球得分預測問題、5604 Kannyi打印模板、4391 集氣袋、4790 津津的儲蓄計划
七、后記
在此對浙教版信息技術教材的編寫者表示崇高的敬意,萬分感謝幫助本文章完成的台州學院老師以及各位朋友,感謝你們對中學計算機教育付出的努力。同時也希望各位讀者可以掌握Python編程這門技術,解放生產力,為我國的數字化進程添磚加瓦。若要繼續學習,參見 Python編程與實際應用-待更新,對應為高中信息技術必修1、2中應用部分;Python編程與數據結構-待更新,對應為高中信息技術選擇性必修1內容。