Python 语法
python代码有严格的缩进限制,不同的缩进代表了不同的含义,请不要随意缩进!!!
变量类型
python不需要 预先声明变量,并且没有显式的类型声明,python 代码最后不需要加分号
a = b = c = 1
# 把 a , b , c 都赋值为1
d,e,f = 777 , 3.14159 , "eeee"
# 把d赋值为777, e赋值为小数3.14159 , f赋值为字符串“eee"
数字
数字类型的变量理论上可以存储无限大的数,但是会受限于计算机的运算速度。
str(字符串类型)
不论双引号"ABC"
,还是单引号 ‘ABC’
,代表的都是字符串(即使是'a'
,也是长度为一的字符串,而不是字符)
列表(list)
列表使用中括号表示。
类似于C中的数组,能够存储一些数据,支持按下标找值。列表中可以存放任何类型,并且单个列表可以存放多种类型
a = [0,[1,2,2,5],[[1]] ]
# a[0] = 0
# a[1] = [1,2,2,5]
### a[1][0] = 1 , a[1][3] = 5
# a[2] = [[1]]
# a[2][0][0] = 1
### a[2][0][1] 下标越界!!!
元组(tuple)
元组用小括号()
表示
和列表类似,常用来函数返回多个值
tup = (111,222,"abc") # tup是一个元组
print(type(tup))# <class 'tuple'>
print(tup[1]) # 222
def func():
name = 'ttt'
age = 114
score = 514
return name,age,score
print(func())#('ttt', 114, 514)
元组同样可以使用下标来访问
集合(set)
集合中的元素无序,不重复。
a = {-1,3,-5,3,2,4,4,4}
print(a)#{2, 3, 4, -5, -1}
字典(dict)
字典,顾名思义,就是用来查找值的,每一项是一个键值对,我们通过键可以找到对应的值,每个键值对表示为 key : value .即一个冒号,左边是键,右边是值。
dic = {"mike" : 1000, "Lisa" : 111 , 114 : 514}
其中"mike", “Lisa”,114是键, 1000,111,514 是对应的值。
假设dic是一个字典,使用dic.pop(“mike”) 来清除mike这个键值对。 使用dic[“aaa”] = “ttt” 来加入一个键值对。
如果我们要判断一个键值对是否存在,应该使用
dic = {"mike" : 1000, "Lisa" : 111 , 114 : 514}
dic[222] = 456
print(dic[222])
print(dic.get(222))
dic.pop(114)
if(not dic.get(114)):
print("No!")
输入输出
输入input
输入使用input() 函数,input函数有以下几个特性:
- 会直接读取完一整行
- 读入后的数据以字符串的形式表示
a = input()
print(type(a))
# 输入
## 123 456
# 输出
## <class 'str'>
我们经常需要使用强制类型转换来变成其他形式的值
inum = int(input())
如果一行有多个整数需要输入怎么办???
# 输入
# 1 2 3 4 5 6 7 8 99
## 1.使用input输入一整行
lst = input()# lst = '1 2 3 4 5 6 7 8 99'
## 2.使用字符串的split()函数来将一个字符串分隔开(默认是遇到空格分隔)
lst = input().split() # lst= ['1', '2', '3', '4', '5', '6', '7', '8', '99']
## 3.使用map函数对列表的每一项进行int操作,此时lst是一个map类型
lst = map(int,input().split()) #此时只可以对lst进行遍历,不可以进行下标访问
## 4. 使用list强制转换为列表
lst = list(map(int,input().split()))# list = [1, 2, 3, 4, 5, 6, 7, 8, 99]
输出
格式化输出:
在字符串前加f,然后字符串内加大括号,{}
a = 55
b = "bbb"
print(f"a is {a}, b is {b}")
确定小数位数用:
a = 55.00
print("{:.5f}".format(a))# 保留5位小数
不想让print之后换行
print("abc",end=" ")
print("bcd",end="")
判断
判断和C中的判断基本一样,区别在于 C中的else if 要换成elif
//C code
int a = 77;
if(a < 60){
printf("Bad!\n");
}else if(a < 80){
printf("Good!\n");
}else{
printf("Perfect!");
}
#python code
a = 77
if a < 60 :
print("Bad")#这里必须要缩进
elif (a < 80):
print("Good!")
else:
print("Perfect!")
#Tab键就是缩进
循环
循环一般使用for和while循环:
for循环
for循环用来遍历某个可枚举的类型(集合,列表,元组,字典,range等等)
先来看看range
#只有一个参数时range(n)表示从0 ~ n-1
range(5) # 0 1 2 3 4
# 有两个参数时range(l,r)表示区间[l,r)
# 区间是左闭右开的
range(5,12) # 5 6 7 8 9 10 11
# 有三个参数时range(l,r,step),表示从l到r(取不到r),步长为step
range(3,8,1) # 3, 4 5 6 7
range(3,8,2) # 3 5 7
range(9,3,-2) # 9 7 5
因此我们的for循环应该这么用:
for i in range(8):
print(i)# 0 ~ 7
lst = [5,7,"bcc",123,677.001]
for i in lst:
print(i) #依次输出每一项
while循环
while循环和C中的用法一样,不再赘述
特殊性质
Python中的循环可以加else,表示循环正常结束时进行的操作:(如果使用break中断循环就不会进行else中的操作)
for i in range(5):
print(i)
else :
print(777)
运算
和C相同的运算就不说了,下面说一下不同:
-
整数除法
//
a,b = 5,2 print(a//b) #5 // 2 = 2
-
求次方
**
a,b = 5,3 print(a**b)#5 * 5 * 5 = 125
-
合并数据类型 + *
# str str1,str2 = "AB","CD" print(str1+str2)#ABCD print(str1 * 3) #ABABAB # list lst1 = [1,2,3] lst2 = [3,4,5] print(lst1+lst2)#[1, 2, 3, 3, 4, 5] print(lst1*3)#[1, 2, 3, 1, 2, 3, 1, 2, 3]
一些小技巧(注意点)
快读
-
使用input输入数据比较慢,有时候可能会导致超时,需要换成sys.stdin.readline()
import sys #引入sys库 num = int(sys.stdin.readline())
B2056 求整数的和与均值 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
使用input耗时85ms
n = int(input()) sum = 0 for i in range(n): num = int(input()) sum += num print('{} {:.5f}'.format(sum,sum/n))
使用readline耗时58ms
import sys n = int(sys.stdin.readline()) sum = 0 for i in range(n): num = int(sys.stdin.readline()) sum += num print('{} {:.5f}'.format(sum,sum/n))
二维数组的定义:
错误样例:
arr = [[0] * 100] * 50
此时当我们使用 a r r [ 5 ] [ 2 ] arr[5][2] arr[5][2], 修改第6行第3列这个元素时,会导致整个第3列都变成这个值(我也搞不懂为什么)
正确示范:
append函数用来向列表的末尾插入一个元素
arr = []
for i in range(50):
arr.append([0] * 100)
快速幂
python的pow函数内置了快速幂
P1226 【模板】快速幂 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
C代码如下:
#include<stdio.h>
#define int long long
int quickpow(int x,int n,int p){
int ans = 1;
while(n){
if(n & 1)
ans = ans * x % p;
x = x * x % p;
n >>= 1;
}
return ans;
}
signed main(){
int a,b,p;
scanf("%lld %lld %lld",&a,&b,&p);
printf("%lld^%lld mod %lld=%lld",a,b,p,quickpow(a,b,p));
}
python代码如下:
a,b,p = list(map(int,input().split()))
print(f"{a}^{b} mod {p}={pow(a,b,p)}")
高精度
python内置了高精度运算
P1601 A+B Problem(高精) - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
a,b = int(input()),int(input())
print(a+b)
P1480 A/B Problem - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
a,b = int(input()),int(input())
print(a//b)
数据结构
常用的数据结构
队列queue
import queue
q = queue.Queue()
提取队头元素(可能导致下标越界,所以使用前要确保(或者判断一下)队列的大小)
print(q.queue[0])
## 同理可以通过queue[1]来获取或更改队列的第二项元素,等等