Python 基礎語法


  • 一行可以寫多個語句,但每一條后面得打 ;
  • 一個語句可以寫多行,但除了最后一行每一行后面得打 \。如果語句中有 [](){} 就不用。
  • python 沒有大括號,只有縮進,空格數量隨意,但是整個代碼中的縮進空格數量必須嚴格相同。
  • 在 python 中 ' '" "''' ''' 基本一樣,都可用作字符串標識,唯一的區別在於 ''' ''' 可以分多行寫,且可以當作多行注釋。
  • python 單行注釋以 # 開頭。

數據類型

數字

整型(int):整數。

浮點型(float):小數。

復數(complex):以 a+bj 的形式來表示,其中 \(a\) 為實部,\(b\) 為虛部,皆為 float。

字符串(str)

由數字、字母、下划線組成的一串字符。在 python 中,字符串是只讀的。

下標方式有兩種:

\[\begin{aligned}s=\ &\texttt a&\texttt b&&\texttt c&&\texttt d&&\texttt e&&\texttt f\\&s_0&s_1&&s_2&&s_3&&s_4&&s_5\\&s_{-6}&s_{-5}&&s_{-4}&&s_{-3}&&s_{-2}&&s_{-1}\end{aligned} \]

為方便敘述,默認使用非負下標。

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++ 一樣,在算術運算符后面加個 = 就完事了,還有一個海象運算符 := 在表達式內部給變量賦值。

邏輯運算符就是 andornot

成員運算符即 innot in,判斷元素是否在序列中。

身份運算符即 isis not,判斷兩個標識符是不是引用自同一對象。

優先級如下:

  1. **
  2. ~+-(注意這里是正負號)
  3. */%//
  4. +-(這里才是加減號)
  5. >><<
  6. &
  7. |^
  8. <=<>=>
  9. ==!=
  10. 賦值運算符
  11. 身份運算符
  12. 成員運算符
  13. 邏輯運算符

可添加括號打破優先級。

輸入輸出

輸入

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);

breakcontinue 用法同 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):# 繼承
	...

說了這么多,還是拿個高精度的題來試試水吧。

P1009 【NOIP1998 普及組】 階乘之和

計算

\[S=\sum_{i=1}^ni! \]

其中 \(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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM