Python基础笔记
运算符
数学
加减乘,+-*
,有浮点就返回浮点
除,/
返回浮点值,即使整除
整除,//
返回整数向下取整
乘方,**
,有浮点就返回浮点
取模,%
逻辑
35>=23 and 24*4==96
true
1+2==3 and (1+1==2 or 2*4==10)
true
字符串
'字符串'
是字符串,“字符串”
是字符串,可以用\
f+字符串
可以让字符串中包含变量,如f'I have a {tool}'
,其中tool是一个变量
lstrip
去除左边的空余(空格,\t,\n),rstrip
右边,strip
全部
string[a:b]
字符串切片,拓展用法见列表/切片
split()
返回一个字符串中所有“单词”的列表(去掉空格缩进换行,分隔)。
len(sample_string)
返回strlen
列表
tools=['pickaxe','axe','shovel','hoe']
基本操作
tools[-1]='hoe'
tools.append('flint and steel')
,则在最后加上打火石
tools.insert(1,'flint and steel')
,则在镐子后面插入打火石
del tools[1]
,则斧头没了
print(tools.pop())
,则锄头没了,输出hoe
;pop也可以有参数,执行print(tools.pop(2))
,则铲子没了,输出shovel
print(tools.remove("axe"))
,则斧头没了。如果有好几个斧头,则只会remove第一个
tools.sort()
,则斧头锄头镐子铲子;tools.sorted()
会临时返回排序后的列表,但本身不变
tools.reverse()
,反转列表
len(tools)
是4
遍历
如下,记得冒号
for tool in tools:
print(tool)
range(a,b)
,指的是[a,b)
numbers = list(range(1, 6))
print(numbers)
输出[1,2,3,4,5]
range(1,10,2)
就是1,3,5,7,9
统计
nums=[2,7,5,3,11]
min(nums)
返回2;max,11;sum,28
squares = [value**2 for value in range(1, 11)] # 返回1-10的平方的list
切片
tools[1:3]
返回['axe','shovel']
,同为左开右闭;[:3]
就是[0:3]
,[1:]
就是[1,4]
列表复制的切片方法(如果直接赋值是指针操作):thetools=tools[:]
设定步长(每隔几个提取):sometools=tools[-4::2]
,则sometools里是镐子和铲子
元组
不能修改内容的列表,但是可以整个一起修改
其他操作和列表几乎相同,包括遍历、统计、切片等
代码格式
PEP(Python Enhancement Proposal)规定:一行不要超过80个字符,缩进是4个空格,不要过多空行
运算符边上最好都空一格,但是我从来不空,而且已经改不掉了
IF
基本用法
例:
for tool in tools:
if tool=="shovel":
print(tool)
print("yes sir!")
elif tool=="axe":
print(tool.upper())
else
print(tool.title())
检查是否在内
对列表或元组有效
'pickaxe' in tools
true
'shovel' not in tools
false
字典
简单理解为索引为任意类型的列表,其实就是哈希表,也可以用作结构体
steve={'health'=20,'saturation'=14,'potion_effect'=1}
基本操作
修改:steve['health']=19
,史蒂夫被仙人掌扎了一下;如果字典内没有health键,则会添加
删除:del steve['potion_effect']
,药水效果这个就没了
get()
steve.get('speed','No point value assigned')
,则如果steve里面有speed就输出对应的值。如果没有就输出后面那段
如果直接输出steve['speed']
,会报错
遍历
遍历键和键值:
for key,value in steve
print(f'{key}:{value}')
遍历键:(两种是一样,默认遍历键)
for key in steve
something
for key in steve.keys()
遍历键值:上面的keys改成value即可
集合
显然,不能有相同元素
tools={'pickaxe','axe','shovel','hoe'}
创建时输入相同元素,会保留第一个
嵌套
字典,列表,元组,集合等都可以互相嵌套,即N维数组
比较合理,没有笔记必要
用户输入
一般输入
name=input("Please enter your name:") # 用户可以在这句话之后输入,并存入message
print(f'Hello, {name.title()}!')
数值输入
直接输入字符串之后,用int(message)
强制转换,例如:
age=input("your age:")
age=int(age)
python中,用int()强制转换字符串会直接把整一串转换为数值。体现了python的新手友好、脱离本质、编程高效、运行低效。我乱叫的。
while循环
例如:
while message!="quit":
message=input("I will repeat after you until you enter 'quit'.")
if message!="quit":
print(message)
(以下内容同C/C++
退出循环:break
进入下一轮:continue
while True:
也可以实现无限循环
函数
在python中,函数不分类型,如果写了return就是有返回值
除了用冒号代替花括号之外,函数的大部分基础操作与C/C++并无二致
默认值
和C++差不多,但是Pistol的这部分C++并没有学好,可能是因为平时用不到:
def build_person(first_name, last_name, age=None): # 默认值部分一定要在后面
person = {'first': first_name, 'last': last_name}
if age:
person['age'] = age
return person
musician = build_person('jimi', 'hendrix', age=27) # age这里不写'age='也可以
print(musician)
musician = build_person('Koji', 'Tabosh') # 田所浩二年龄显然是24歲,所以不用写
print(musician)
传递列表
和C++一样,传递的是头指针,所以函数中对列表的操作会对列表产生永久影响。
要避免修改,需要用切片表示法:sample_function(list1[:])
传递任意数量的参数
使用星号+形参的格式,可以让传入的参数形成一个元组,在函数中,可以用处理元组的方式处理这些数据。如果除了这个元组之外还有其他参数,需要让其他普通形参放在前面(显然)。
def make_pizza(*toppings):
print("\nMaking a pizza with the following toppings:")
for topping in toppings:
print(f"- {topping}")
make_pizza('pepperoni')
make_pizza('mushrooms', 'green peppers', 'extra cheese')
传递任意数量的带键值参数
类似上面的,但是用两个星号+形参名,形成一个字典。
模块化编程
例如:
# player.py
def mining(pickaxe_value, haste_level, efficiency_level)
speed=pickaxe_value*(efficiency_level**2)*(1+haste_level*0.2)
return speed
def attack_damage(weapon_value, strength_level, sharpness_level)
damage=114514 # 懒得查力量和锋利的计算函数了
return damage
from player import mining
# 于是可以使用player中的mining函数,这里是直接调用,多个函数用逗号分隔
spd=mining(1,2,3)
import player
# 于是可以使用player中的所有函数,但是需要声明模块名
spd=player.mining(1,2,3) # 和C/C++一样的调用方式
非常清晰,但是注意区分两种导入方式的调用方法
也可以用from player import *
一键导入所有函数且不带模块名使用
as
一种define而已。例如:
from player import mining as mn
spd=mn(1,2,3)
import player as plyr
spd=plyr.mining(1,2,3)
类
创建类:和C++几乎一样,括号换成冒号,构造函数名字换成__init__
,并且只要声明函数,变量开箱即用。
创建实例和C++完全一样,调用函数和C++完全一样。
python没有private,所以代码安全性比C++要垃圾不少。
继承
用不到,先不学了。和C++一个逻辑,就是写法有少许区别
导入类
和前面的导入函数没有区别。一点都没有。
python有很多很牛逼的标准库,以及一大堆社区提供的库。python除了这一点之外比C++烂多了,但是就因为这一点,在很多时候比C++牛逼。
操作文件
读取文件
with open('1.txt') as file_object:
contents = file_object.read()
print(contents.rstrip())
使用read()
的时候,末尾会多出一个空行,故使用rstrip()
去掉。
文件路径默认同一个目录的相对路径,绝对路径就开头斜杠。(这有什么好说的,全球统一
虽然windows用反斜杠表示路径关系,但是不影响在代码中使用斜杠表示。
读取数组
使用JSON存储的数组文件,但是我不会。要用再学。
逐行读取
with open('1.txt') as file:
for line in file:
list1.append(line.rstrip())
上面的方法更适合对每一行进行操作,如果只是要创建列表,也可以直接用readlines
:
with open(filename) as file:
lines = file.readlines()
注意,用以上方法生成的列表,每一个字符串的末尾都有换行。
写入文件
filename = 'programming.txt'
with open(filename, 'w') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
write()
函数不带换行,这个print的默认值不同。
open()
的第二个位置:默认只读,‘r’只读,‘w’写入,‘a’附加,‘r+‘读写
注意,写入只支持字符串(与C不同),写入数值需要先用str()
转换。
附加到文件
filename = 'programming.txt'
with open(filename, 'a') as file_object:
file_object.write("I love programming.\n")
file_object.write("I love creating new games.\n")
与上面写入的程序只有open的参数不同,不过在此程序运行后,只会在programming.txt
后面添加这两行,而不是整个文件只有这两行。
异常处理
算了,暂时没用。和C++差不多。