文章目录
前言
Python快速入门的个人笔记。视频链接:2021国外最新 Python 教程 6 小时入门,目前最好的python教程 (含中文翻译)6小时
环境配置
下载
到python.org下载最新版本的Python。
安装
安装时,确保勾选上Add Python To PATH。
VS Code配置
VS Code安装上这个微软官方插件,就可以很好的用来开发Python了。你也可以选择PyCharm。
基本语法
变量
python的变量,和lua一样是弱类型的。
goods = "Cup"
quantity = 1
price = 10.0
is_used = False
用户输入
python获取用户输入,使用input函数。
name = input("What is your name?")
print("Hi " + name)
类型转换
python使用以下函数进行类型转换。
int()
float()
bool()
举个例子:
birth_year = input("Birth year? ")
age = 2021 - int(birth_year)
print(age)
使用type()
可以得到变量类型。
块
C++中,定义一个作用域使用"{" “}”,在python中,定义一个块用到":",python的块和C++作用域有些许不同,不过都是表示一个代码范围。python中,一个块中的代码拥有相同的缩进格式(逼死代码书写不规范的人),代码要离开块只需要不缩进就可以了。
注释
python用"#"符号来标记注释
# 这是一句注释
字符串
字符串定义
python的字符串可以使用单引号表示,也可以使用双引号。
name = 'CurtainXT'
name = "CurtainXT"
当字符串中出现单引号时,与定义字符串时使用双引号不冲突,字符串中出现双引号亦然。这可以用于在短的字符串中处理单双引号。
my = "CurtainXT's"
so = '"so?"'
print(my)
print(so)
使用’’’ ‘’‘也可以定义一个字符串,这样的字符串会将’’’ ‘’'中间的内容和格式完全保存下来,下面的例子将换行,字符串中的’和"都保存了下来。
email = '''
Hi Hi Hi
this is a test email, " ' ok
Thank you!
'''
print(email)
使用"*"运算符对一个字符串可以得到一个内容重复n遍的新字符串。
print("*" * 10)
字符串索引
python字符串索引和C++一样,可以取得字符串中特定位置的元素,python的字符串是只读的。
索引和C++一样都是从0开始,但是python有个绝活,负数索引,从后往前开始数,-1是字符串的最后一个元素。
name = 'CurtainXT'
print(name[2], name[-2])
python字符串索引还有一个操作,可以得到一个索引范围内的元素组成的子字符串,在索引的方括号运算符中使用":"来链接两个索引,左边是开始的位置,右边是结束位置,子字符串不包括结束位置的元素。如果我们不提供结束索引,字符串的长度将被假设为结束索引,得到的将是从开始索引往后的所有元素,同样不提供开始索引得到的是从0到结束索引前的所有元素。
name = 'CurtainXT'
nam = name[:8]
print(name[2:6])
print(name[2:])
print(name[:4])
索引还有一个用处,你给"[:]"的索引得到的是该字符串所有字符拷贝的新字符串,这可以用来对字符串进行拷贝。
name ="CurtainXT"
name_again = name[:]
上面的代码如果直接让name_again = name
,name_again得到的不是新字符串,而是成了name的引用。
最后,如果给的前后范围不对,得到的是一个空串。
nam = name[4:2] #得到空串
格式化字符串
结构化字符串是前缀带有一个f的字符串,可以使用{}来向字符串中插入变量。
first = "xu"
last = "tao"
msg = f"{first} [{last}] is a coder"
print(msg)
字符串方法
可以使用len()方法得到字符串的长度。
name = "CurtainXT"
print(len(name))
len()这种属于通用的函数,python还提供了字符串专用的方法,这些方法通过成员访问符"."就可以得到,注意,这些方法不会改变变量本身。
注:通用的函数叫函数,属于某个类的函数叫方法。
name = "CurtainXT"
print(name.upper()) #所有字母转换成大写
字符串方法有很多
你还可以用关键字in来判断给定字符(串)是否在某个字符串中,同样我们还有find方法,只不过find返回的是相同位置的索引。
name = "CurtainXT"
print("Cur" in name)
运算
算术运算符
python中内置的算数运算有。
print(10 + 3)
print(10 - 3)
print(10 * 3)
print(10 / 3)
print(10 // 3) #整数除法
print(10 % 3) #余数
print(10 ** 3) #指数
python中也有C++中的复合赋值运算符,叫增强赋值运算符(Augmented Assignment Operator)。
x = 10
x += 3
print(x) #指数
x *= 3
print(x) #指数
数学处理函数
下面介绍一些有用的数学处理函数。
x = 2.9
print(round(x)) #四舍五入
print(abs(-2.9)) #绝对值
如果要进行更复杂的数学运算,要引入数学模块。
import math
逻辑运算
python中的逻辑运算如下:
condition1 = True
condition2 = False
print(condition1 and condition2) #与运算
print(condition1 or condition2) #或运算
print(not condition1) #非运算
比较运算
python的比较运算符和C++一样的。
x = 30
print(x == 31)
print(x > 31)
print(x < 31)
print(x >= 31)
print(x <= 31)
print(x != 31)
控制流
判断
python中的if、else和else if长这样,python使用缩进来确认语句受不受语句控制,下面代码的最后一个print没有缩进,所以不受控制。
condition1 = False
condition2 = False
if condition1:
print("condition1")
elif condition2:
print("condition2")
else:
print("No")
print(0)
print("Hello")
python没有C++那么严格的变量作用域,控制流语句中出现的临时变量到了语句外部也可以访问,前提是确实在访问前运行了该变量的定义语句,我现在算是明白严格的变量作用域的好处了。
condition = True
if condition:
print(1)
x = 10
print(x) #正常访问x
condition = False
if condition:
print(1)
x = 10
print(x) #报错
循环
python中的循环是这样。
i = 1
# while Loop形式
while i< 100:
print(i)
i += 1
# for Loop形式
for item in "CurtainXT":
print(item)
注:VSCode终端死循环了按Ctrl + C可以终止前台程序。
for循环中使用range可以得到一个范围内的数(数组?),比如range(5, 10)得到5,6,7,8,9,不包括10,range拥有缺省默认值,只给1个参数会从0开始。
for item in range(5, 10):
print(item)
嵌套循环代码。
for x in range(4):
for y in range(3):
print(f"({x}, {y})")
函数
函数定义
python中的函数定义方式如下:
def greet_user():
print("Hello")
函数参数
函数参数声明:
def greet_user(name):
print(f"Hello {name}")
def greet_user1(name = "XT"): #默认参数
print(f"Hello {name}")
关键字参数
众所周知实参是按照位置传递给函数形参的(位置参数),而python的关键字参数能让我们指定某个实参传递到哪个形参。
def greet_user(first_name, last_name):
print(f"Hello {first_name} {last_name}")
# 调用函数
greet_user(last_name = "Smith", first_name = "John") #关键字参数 "Smith"传递给了last_name "John"传递给了first_name
大多数时候我们不会使用关键字参数,但是关键字参数有时可以帮助改善代码的可阅读性。
如果你要混合使用位置参数和关键字参数,确保位置参数使用在关键字参数前,且确保参数传递没有冲突。
返回声明
由于python弱类型,函数不需要声明返回类型,只需要return就行。
def square(number):
return number*number
对于python来说,没用返回声明的函数默认返回none。none可以理解为C++、C#里的null。
异常处理
python使用try except来进行异常捕获和处理。将可能出现错误的代码放到try块下面,将可能捕获到的异常信息(python标准异常链接)放到except后面,将处理方法放到except块下面。
try:
age = int(input("Age: "))
print(age)
except ValueError: #ValueError是python定义的错误信息 意味着传递了无效的参数
print("Invalid value")
数据结构及算法
列表
列表定义
列表是类似数组的数据结构,定义方式如下:
numbers = [1, 2, 3, 4]
names = ["John", "Bob", "Mosh", "Tom"]
列表和字符串不一样,字符串是只读的,但是列表可以修改元素的值,列表索引的操作和字符串索引类似,不再赘述了。
names = ["John", "Bob", "Sarah", "Mary"]
names[0] = "Tom"
二维列表
二维列表,对标C++二维数组,定义方式如下:
# 这是一个3*3矩阵
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
元素访问方式如下:
matrix[0][1]
下面代码使用嵌套循环遍历二维列表。
for row in matrix:
for item in row:
print(item)
列表方法
python为列表内置了一套算法,称为列表方法,通过"."访问这些方法。
下面的代码演示了insert算法。
numbers = [5,2,1,7,4]
numbers.insert(2,6) #插入算法
同样可以使用in和not in关键字来检查某个值是否在列表里。
print(5 in numbers)
元组(Tuple)
元组是一种与列表类似的数据结构,不同之处在于元组的元素不能修改,所以当你需要一个列表又不希望里面的元素被修改时,就使用元组。元组的定义方式如下:
numbers = (0,1,2,3)
由于元组的元素不能修改,元组只提供了count和index两个方法。
元组和元组相加可以得到一个新的元组,新元组中按先后包含相加的两个元组的元素。
tup3 = tup1 + tup2
print tup3
解压缩(Unpacking)
python中有一种语法可以很方便的得到数据结构中的各个元素,如下所示:
coordinates = (1,2,3) #我想得到它的三个元素
# 常规方案
x = coordinates[0]
y = coordinates[1]
z = coordinates[2]
# 解压缩方案
x,y,z = coordinates #实现了和常规语法一样的工作
就是要注意一点,解压缩时给到的变量(例子中的x,y,z)的数量要正好和数据结构中的元素数量一致。
字典(Dictionary)
python中的字典可以用来存储键值对,定义方式如下:
customer = {
"name":"XT",
"age":21,
"educated":True
}
字典中的key需要是唯一的,字典通过在"[]“中输入key来得到对应的value,也可以使用get方法,get方法相比”[]"在key不存在时不会报错,而是返回一个none,你甚至可以指定一个key不存在时的默认值。
# []运算符方案
print(customer["name"]) #得到"XT"
# get方法方案
print(customer.get("birthday", "2000.1.1")) #找不到关键字birthday 会得到默认值"2000.1.1" 如果没有指定默认值会得到None
面向对象
类
类的定义
python中类的定义代码如下:
class Point:
def move(self):
print("move")
def draw(self):
print("draw")
可以看到,定义方法时要显式声明参数self,相当于C++的this。
定义类的对象:
point1 = Point()
对像的属性可以在任意时候定义,定义某个对象的属性先要有这个对象,因为在python中每个对象拥有自己的属性,其它对象不拥有。
point1.x = 10 #定义point1的属性x
print(point1.x)
# 假设我们还有point2
point2 = Point()
print(point2.x) #报错 point2未定义属性x
如果你想要对象在创建时就拥有某些属性,你要在构造函数中做这件事。
构造函数
上面提到,如果你想要对象在创建时就拥有某些属性,你要在构造函数中做这件事。python的构造函数定义如下:
class Point:
def __init__(self, x, y):
self.x = x #对象创建时就有的属性在这里定义
self.y = y
python所有类的构造函数都命名为__init__(self)
,但是创建新对象时依旧是Point(10, 2)
(类名(参数))。
point1 = Point(10 ,2)
print(point1.x)
继承
python的继承方式如下:
class Animal:
def walk(self):
print("walk")
class Cat(Animal):
def meow(self):
print("meow")
注:python不能定义空类,如果类里面真的不需要写东西,比如继承了基类的东西就够了,就写个pass
class Dog:
pass
class Cat(Animal):
pass
模块和包
模块(Modules)
模块是一个python文件,将一个项目相关的函数和变量放入一个个的模块中可以更好的管理你的项目代码。放在同级目录模块使用import就可以直接引入到当前文件,python模块的理念类似C++的头文件,但是python模块是直接被当成一个对象的。
# converters.py
def lbs_to_kg(weight):
return weight * 0.45
def kg_to_lbs(weight):
return weight / 0.45
# app.py
import converters #引入converter模块
print(converters.kg_to_lbs(40)) #使用converters模块中定义的函数
我们还可以只引入模块中的某个函数,这样就可以直接调用这个函数了。
from converters import kg_to_lbs
print(kg_to_lbs(40))
你甚至可以将模块中的所有内容全部引入:
from converters import *
包(Package)
包是模块的容器,或者说,包是一个文件夹/文件目录。当一个文件夹中有一个叫__init__.py的文件时,python解释器就会将该文件夹当作一个包。下图中my_package就是我们定义的一个包。
下面代码引入包中模块,并调用其中的函数。
import my_package.shipping
my_package.shipping.calc_shipping()
你同样可以使用from import语句。
from my_package import shipping
shipping.calc_shipping()
# or
from my_package.shipping import calc_shipping
calc_shipping()
最后
首先将数字图像处理期末应付了再说