- 一行可以寫多個語句,但每一條后面得打
;
。 - 一個語句可以寫多行,但除了最后一行每一行后面得打
\
。如果語句中有[]
、()
、{}
就不用。 - python 沒有大括號,只有縮進,空格數量隨意,但是整個代碼中的縮進空格數量必須嚴格相同。
- 在 python 中
' '
、" "
、''' '''
基本一樣,都可用作字符串標識,唯一的區別在於''' '''
可以分多行寫,且可以當作多行注釋。 - python 單行注釋以
#
開頭。
數據類型
數字
整型(int):整數。
浮點型(float):小數。
復數(complex):以 a+bj
的形式來表示,其中 \(a\) 為實部,\(b\) 為虛部,皆為 float。
字符串(str)
由數字、字母、下划線組成的一串字符。在 python 中,字符串是只讀的。
下標方式有兩種:
為方便敘述,默認使用非負下標。
s[a:b:c]
截取 \(s\) 下標在 \([a,b)\) 范圍內的部分且截取步長為 \(c\)。若 \(a\) 為空,則從頭開始取;若 \(b\) 為空,則取到末尾;若 \(c\) 為空,則挨個取。
a+b
表示把 \(a\)、\(b\) 兩個字符串連起來。
a*b
表示把 \(a\) 重復 \(b\) 遍。
跨行字符串需要用三引號括起來。
r'\n\t\v\f'
不處理轉義字符,直接按照原始字符串處理。
轉義字符:
\
在行尾為續行符。\\
\(\Rightarrow\)\
\'
\(\Rightarrow\)'
\"
\(\Rightarrow\)"
\a
\(\Rightarrow\) 響鈴,輸出后電腦會響鈴。\b
\(\Rightarrow\) Backspace\000
\(\Rightarrow\) 空字符\n
\(\Rightarrow\) Enter\v
\(\Rightarrow\) 豎向 Tab\t
\(\Rightarrow\) 橫向 Tab\r
將光標移到行首。\f
換頁\八進制數
、\x十六進制數
代表其對應的字符。- 其他的按照原字符處理。
列表(list)
由 []
括起來的一堆有序元素,可以為數字、字符、字符串甚至是列表。內部對象類型可以不一致。
下標、切割、連接、重復同字符串。
元組(tuple)
由 ()
括起來的一堆有序元素,除了只讀以外和列表用法一樣。
字典(dict)
由 {}
括起來的一堆無序元素,類似 C++ 中的 map,定義方式:
a={}
a[x]=y
a[y]=z
或是
a={x:y,y:z}
\(x\)、\(y\)、\(z\) 可以是任意不同類型,這樣訪問 a[x]
返回的就是 y
,訪問 a[y]
返回的就是 z
。
集合(set)
一堆無序元素,由 {}
括起來的 非空集 或 set()
定義的任意集。內部元素不可重。只讀集合為 frozenset
。
基本操作:
- 差集:
a-b
; - 並集:
a|b
; - 交集:
a&b
; - 不同時存在的元素:
a^b
;
類型轉換
一般格式:轉換類型(轉換對象)
一些特殊的:
int(x,base)
將 \(x\) 轉換為 \(base\) 進制下的整數,\(base\) 默認為 \(10\),若不是 \(10\),則 \(x\) 需要以字符串的形式輸入;complex(x[,y])
創建復數 \((x+yi)\)。repr(x)
將對象 \(x\) 轉化為一個字符串。eval(x)
為repr(x)
的反函數,即將字符串 \(x\) 轉化為一個對象。chr(x)
將整數 \(x\) 轉為字符。ord(x)
將字符 \(x\) 轉為整數。hex(x)
、oct(x)
將整數 \(x\) 分別轉化為十六進制、八進制的字符串。
推導式
列表推導式
[表達式 for 變量 in 列表 if 條件]
后面的 if 條件
可有可無。
字典推導式
同上。
集合推導式
同上。
元組推導式
同上。
運算符
加減乘除模、比較運算符、位運算符和 C++ 都一樣,x**y
返回 \(x^y\),x//y
返回 \(\lfloor\frac x y\rfloor\)。
賦值運算符也和 C++ 一樣,在算術運算符后面加個 =
就完事了,還有一個海象運算符 :=
在表達式內部給變量賦值。
邏輯運算符就是 and
、or
、not
。
成員運算符即 in
和 not in
,判斷元素是否在序列中。
身份運算符即 is
和 is not
,判斷兩個標識符是不是引用自同一對象。
優先級如下:
**
~
、+
、-
(注意這里是正負號)*
、/
、%
、//
+
、-
(這里才是加減號)>>
、<<
&
|
、^
<=
、<
、>=
、>
==
、!=
- 賦值運算符
- 身份運算符
- 成員運算符
- 邏輯運算符
可添加括號打破優先級。
輸入輸出
輸入
a=input()
即可,但注意默認輸入進來的會處理成字符串類型。
如果想要提示信息,就是:
a=input('Please input a:')
一口氣輸多幾個就可以:
a,b,c=(input().split())
輸出
print(x)
相當於
cout<<x<<endl;
print(x,y)
相當於
cout<<x<<' '<<y<<endl;
print(x,end=',')
相當於
cout<<x<<',';
str.rjust(x)
可將字符串按照 \(x\) 位右對齊,並在左邊添加空格;str.ljust(x)
可將字符串按照 \(x\) 位左對齊,並在右邊添加空格;str.center(x)
可將字符串按照 \(x\) 位居中,並在兩邊添加空格;str.zfill(x)
可將字符串按照 \(x\) 位右對齊,並在左邊添 0
。
answer=0
print(f'The answer is {answer}')
的輸出為 The answer is 0
。花括號內會計算表達式結果並替換到字符串的相應位置。
如果想保留三位小數點,可以這樣:
import math
print('{0:.3f}'.format(math.pi))
文件
f=open('in.txt',mode)
以 mode 模式打開 in.txt。其中,mode 的取值如下:
't'
文本模式,默認。'x'
寫模式且新建一個文件。'b'
二進制模式打開。'+'
更新文件,可讀可寫。'r'
只讀。'rb'
二進制格式只讀。'r+'
讀寫。'rb+'
二進制格式讀寫。'w'
只寫。'wb'
二進制格式只寫。'w+'
讀寫。'wb+'
二進制格式讀寫。'a'
追加(只寫)。'ab'
二進制格式追加(只寫)。'a+'
追加(讀寫)。'ab+'
二進制格式追加(讀寫)。
其中,除了以 r 開頭的,都會在找不到文件的情況下在當前目錄創建對應的新文件進行讀寫。以 w 開頭的打開文件時會清空文件,以 a 開頭的打開文件時會保留文件原內容並將指針置於文件尾。
open 函數將返回一個文件對象。
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
相當於
open('in.txt');
open('out.txt','w');
假如我們把 open
函數返回的文件對象存儲在 \(f\) 中,則 f.read(size)
將讀取 \(size\) 數目的字符。如果 \(size\) 為空,則讀取該文件中的所有數據。
f.readline()
讀取文件中單獨一行。
f.readlines()
讀取文件中所有行。
f.write(str)
向文件中寫入字符串 \(str\),並返回寫入的字符數。
f.tell()
返回當前文件指針在文件中所處的位置,即文件的第幾個字節。
f.seek(x,y)
移動當前文件指針的位置。
- \(y=0\),默認值,文件指針從頭開始往后移動 \(x\) 個字節。
- \(y=1\),文件指針從當前位置開始往后移動 \(y\) 個字節。
- \(y=2\)。文件指針從尾開始往前移動 \(y\) 個字節。
f.close()
關閉文件。
語句
條件語句
if x>0:
print('正數')
elif x<0:
print('負數')
else:
print('0')
相當於
if(x>0) puts("正數");
else if(x<0) puts("負數");
else puts("0");
循環語句
while i<=n:
i+=1
相當於
while(i<=n) i++;
while i<=n:
i+=1
else:
print('i>n')
中,while
中的語句會正常執行,當循環正常退出(即非 break
強制退出)后會執行。for...else
同。
a=[1,2,3,4,5]
for i in a
print(i)
相當於
for(auto i:a) printf("%d\n",i);
for i in range(1,10,3)
print(i)
相當於
for(int i=1;i<10;i+=3) printf("%d\n",i);
break
、continue
用法同 C++。
迭代器
同 C++,用於遍歷容器。
iter(list)
用於創建一個 list
的迭代器。
可以用在 for
循環中遍歷整個容器:
it=iter(list)
for i in it
print(i)
也可以使用 next()
函數:
import sys
it=iter(list)
while True:
try:
print(next(it))
except StopIteration:
sys.exit()
函數
一個 C++ 的求斐波那契數列的函數:
int fib(int n)
{
if(n<3) return 1;
else return fib(n-1)+fib(n-2);
}
寫成 Python 就是:
def fib(n):
if n<3:
return 1
else
return fib(n-1)+fib(n-2)
不定長函數的寫法:
def func(arg,*args)
前面數個 arg 是固定參數,args 是不固定參數,會以元組的形式傳入。如果是兩個星號,就會以字典的形式傳入。
\(\lambda\) 表達式是 Python 一個重要的特點,
sum=lambda a,b:a+b
調用時直接像普通函數一樣 sum(a,b)
調用就行了。
類
class node:
x=0
y=0
def sum(self,x,y):# self 為必須的一個參數
return x+y
def __sum(self,x,y):# 兩個下划線開始的為私有方法
return x+y
def __sum__(self,other):# 兩邊都是兩個下划線為重載運算符
return node(self.x+other.x,self.y+other.y)
def __init__(self,x,y):# 構造函數
self.x=x
self.y=y
class edge(node):# 繼承
...
說了這么多,還是拿個高精度的題來試試水吧。
計算
其中 \(1\le n\le 50\)。
這用 Python 豈不是簡簡單單、有手就行?
n=int(input())
fac=1
sum=0
for i in range(1,n+1):
fac*=i
sum+=fac
print(sum)