Python:快速入门
为了辅助 Intelligence Systems 课程,本文提供一个快速理解 Python 代码的简易教程,部分表述和举例并不严谨,见谅。
对于基础语法、结构部分,文章会提供一些 c/c++ 的例子以供参考。
注意,不必纠结为什么这么写,语法只需要记住即可。
有点儿不一样?
Python 和以往学习的 C/C++, Java 略有不同,他是一种 解释型语言 因此在编写和运行上有一些不同,此处列举几处十分明显的不同:
- 没有主函数
main
- 可以直接编写代码,执行时按顺序执行
- 变量不需要定义类型(弱类型、动态类型语言)
- 语法更加简洁
- 不使用花括号
{}
来标识代码块- Python 通过缩进来标识代码块(代码作用域)
- 不需要使用分号
;
- 不使用花括号
- 有丰富的第三方库,并且导入简单、管理便捷
- 第三方库以面向对象的形式封装,可以通过简单的接口调用实现复杂的功能
- 例如
matplotlib
可以对数据进行便捷的可视化
针对这些不同下面通过具体的代码,使用 C/C++ 进行比较以便于理解。
注意,Python 可以直接通过解释器(小黑框)执行,但是这里仅讨论将 Python 编写为程序(脚本)然后再执行的情况,也就是我们需要编写一个 .py
程序,然后再点绿色的小三角运行程序。
IO 及变量
- 变量声明
- 基本数据类型
- 输入输出
- 字符串
什么是弱类型(变量声明)
弱类型即不需要限制变量是否为 int,double 或者 string(字符串)。
可以形象的理解为:
C 语言的变量是大小不同的杯子,酒盅用来装白酒、高脚杯装红酒、玻璃杯子装啤酒等等,不同类型的杯子需要装不同的东西,使用者必须严格执行这个标准。
Python 的变量是一个万能的大桶,这个桶可以装任何东西,白酒、红酒、啤酒都可以,并且装完白酒后同一个桶可以继续装红酒或者啤酒,甚至你可以在桶里再放一个桶。
Python 中的变量都是万能变量!
例如,如果我们需要三个变量保存:
- 姓名(字符串)
- 年龄(整型变量)
- 学分绩点(浮点型)
C语言:
// C
char name[100] = "Rain";
int age = 21;
double GPA = 3.86;
Python:
# Python
name = "Rain"
age = 21
GPA = 3.86
总结:Python 中声明变量直接赋值就行了!
基本数据结构1 – 列表-> list
在 C 中我们接触到了 数组(array),在 C++ 中有 vecotr(动态数组),Java 中有 ArrayList,与之对应的Python中有列表(list)
最简单的理解:Python中的列表就是之前学的数组,并且是一个超级数组!一个数组中可以存储不同类型的变量。
与C中数组的异同:
- 相同点:
- 都通过
[]
访问元素,并进行修改 - 下标都从 0 开始
- 都通过
- 不同点
- 与变量一样,不需要声明类型
- 同一个数组中可以存放不同的类型
- 不需要声明数组长度
- 添加元素需要调用
.append()
方法
Example 1:存储同一类型
C语言:
// C
int arr[10] = {0,1,2,3,4,5,6,7,8,9}
arr[3] = 14
// 不支持动态添加元素,不做演示
Python:
# Python
arr = [0,1,2,3,4,5,6,7,8,9]
arr[3] = 14
# 动态添加元素
arr.append(10)
# 目前数组中:[0,1,2,14,4,5,6,7,8,9,10]
Example 2:存储不同类型:
例如我们需要将上面的姓名、年龄、GPA存储到一个数组中,C/C++ 无法做到这一点,但是Python可以:
Python:
# Python
student_info = ["Rain", 21, 3.86]
基本数据结构2 – 字典-> dict
Python 中另一个非常常用的数据结构是 字典,如果你了解 C++ 的 map,那么应该对这个用法并不陌生,我们直接通过一个例子来进行演示:
我们尝试使用结构体和字典存储上面的姓名、年龄、GPA并且输出(以下程序可以直接运行):
C++:
// C++
#include<bits/stdc++.h>
using namespace std;
struct student_info{
string name;// string 就是 字符串
int age;
double GPA;
};
int main(){
student_info rain;
rain.name = "Rain";
rain.age = 21;
rain.GPA = 3.86;
cout<<rain.name<<endl;
cout<<rain.age<<endl;
cout<<rain.GPA<<endl;
return 0;
}
# Python
rain = {
"name":"Rain",
"age" : 21,
}
rain["GPA"] = 3.86
print(rain["name"])
print(rain.get("age"))
label = "GPA"
print(rain)
# running result:
# Rain
# 21
# 3.86
上面使用到了 Python 的输出,将在下一节中介绍,这里可以复制并运行,然后理解运行结果即可.
上述代码中涉及到了字典的:
- 初始化
- 添加新值
- [] 访问元素
- .get() 访问元素
其中 2 3 最常用。
这里插入一个重要知识点 key-value 键值对,格式为:key:value
value 可以为任何数据类型,但是 key 必须为 字符串。
对于 Python 中的字典,其每一项都是一个 key-value 键值对,因此在初始化时需要遵守键值对的规则。
输入输出
输入在这里不作为重点,仅给出一个例子,其使用方法显然:
# Python
res = input("please input a number:")
print(res)
python 中的 print 几乎可以输出所有的变量,包括数组和字典:
# Python
student_info = ["Rain", 21]
# Python 支持直接输出数组
print(student_info)
rain = {
"name":"Rain",
"age" : 21,
}
# 输出字典的内容
print(rain)
与字符串:
穿插一个小知识点,python中可以使用字符串模板f""
来格式化字符串,其效果类似C语言中的 printf,但是更简洁:
C++:
// C++
#include<bits/stdc++.h>
using namespace std;
struct student_info
{
string name;
int age;
};
int main()
{
student_info rain;
rain.name = "Rain";
rain.age = 21;
printf("现在%s已经%d岁了!\n", rain.name.c_str(), rain.age);
return 0;
}
Python:
# Python
rain = {
"name":"Rain",
"age" : 21,
}
print(f'现在{rain["name"]}已经{rain["age"]}岁了!')
控制、循环结构
- if、elif、else
- while
- for
在该部分大家需要习惯:
- 使用缩进表示的代码块
- 语句结束后需要添加冒号
:
if语句
需要注意:
- if 条件不需要括号
- else if 缩写为 elif
其他地方无太多需要注意
C++:
// C++
int age;
if (age >= 18)
{
cout << "成年了,防沉迷系统解除了" << endl;
}
else if (age >= 12)
{
// 注意这里 else if 和 python 的区别
cout << "可以充钱了!" << endl;
}
else
{
cout << "不满 12 岁,禁止充钱!!" << endl;
}
Python:
age = 21
if age >= 18 :
print("成年了,防沉迷系统解除了")
elif age >= 12:
# 注意这里 else if 和 c++ 的区别
print("可以充钱了!")
else:
print("不满 12 岁,禁止充钱!")
while语句
与 if 类似,可自行对比:
C++:
// C++
int age = 10;
while(age<18)
{
age+=1;
cout<<age<<endl;
}
Python:
age = 10;
while age < 18:
age += 10
print(age)
嵌套使用可以更好的体会缩进对作用域的控制:
# Python
name = "Bulbul"
sex = "male"
age = 21
if sex == "female":
# while 结构
while age < 20:
# python 中没有 age++ 这种操作,只能用 += 1 代替
age += 1
# 字符串的模板用法,类似 printf ,但是更简洁
print(f'现在{name}已经{age}岁了!')
print(f'现在{name}可以结婚了!')
elif sex == "male":
while age < 22:
age += 1
print(f'现在{name}已经{age}岁了!')
print(f'现在{name}可以结婚了!')
else:
print("沃尔玛购物袋")
for 语句
for 语句是十分重要的一个语句,并且 Python 中的 for 与 C/C++ 中区别较大。
其基本结构为for 循环变量 in 需要遍历的对象
,具体的,来看代码:
如何实现类似c++中的这种循环呢:
// C++
for(int i=0;i<10;i++)
{
cout<<i<<endl;
}
python 中可以通过 range()
实现:
# Python
# 默认从 0 开始
for i in range(10):
print(i)
# 限制范围
for i in range(10,20):
print(i)
与数组、字典结合使用:
语法如此,记住即可
# Python
student_info = ["Rain", 21]
rain = {
"name":"Rain",
"age" : 21,
}
# 对于指定的数组,直接这样就可以
for i in student_info:
print(i)
# 字典同样可以使用,但是效果略有不同,此处不做说明,请自己运行
for i in rain:
print(i)
for i in rain:
print(i,rain[i])
嵌套的二维数组使用 for 循环
对于二维数组,大家可以对比三种不同的输出结果:
# Python
student_info = [["Rain", 21, 3.87], ["Sun", 11, 3.85], ["Bulbul", 15, 2.85]]
print("---------- result1 ----------")
print(student_info)
print("---------- result2 ----------")
for i in student_info:
print(i)
print("---------- result3 ----------")
# 嵌套输出
cnt = 0
for i in student_info:
cnt += 1
print(f"第{cnt}个:")
for j in i:
print(j)
函数怎么用
基本格式为:
def 函数名( 参数列表 ):
不需要返回值类型,参数列表只要写出参数名即可,不需要标明类型
例如:
def set_name(name):
基本用法
直接看代码:
c++:
// C++
#include<bits/stdc++.h>
using namespace std;
string check_age(int age)
{
if(age>=18)
{
return "成年了,防沉迷系统解除了";
}else if(age>=12){
return "可以充钱了!";
}else{
return "不满 12 岁,禁止充钱!";
}
}
int main()
{
int age = 21;
string res;
res = check_age(age);
cout<<res<<endl;
return 0;
}
# Python
def check_age(age):
if age >= 18 :
return "成年了,防沉迷系统解除了"
elif age >= 12:
# 注意这里 else if 和 c++ 的区别
return "可以充钱了!"
else:
return "不满 12 岁,禁止充钱!"
res = check_age(21)
print(res)
解包,非常重要的操作
该操作 C++ 不存在,因此不做对比。
解包就是讲将一个数组、集合中的元素分别取出来:
# Python
student_info = ["Rain", 21, 3.87]
stu_name, stu_age, stu_GPA = student_info
print(stu_name,stu_age,stu_GPA)
python 中的函数支持返回多个变量,这个操作常与解包一起进行,请对比以下代码运行结果:
# Python
student_info = [["Rain", 21, 3.87], ["Sun", 11, 3.85], ["Bulbul", 15, 2.85]]
def get_details(info):
name = info[0]
age = info[1]
GPA = info[2]
# 多个返回值是被允许的
return name,age,GPA
# 使用一个参数接受返回值
for i in student_info:
all_info = get_details(i)
# 打印的时候注意和数组的不同
print(all_info)
# 解包操作接收返回值
# 理解多个返回值可以这样操作即可!
# 看到这个操作能够理解
for i in student_info:
stu_name, stu_age, stu_GPA = get_details(i)
print(stu_name,stu_age,stu_GPA)
三个例子
以下三个例子已经在 QQ 群中发送过了,因此不再详述,仅贴出代码来。
Example 1
- 声明变量不需要具体的数据类型
- 变量可以接受任何类型的数据
- 数组和变量是一样的,不需要声明类型
- 数组是动态数组,不需要声明长度
- 数组动态添加元素需要用 .append()
- . 程序输出使用 print()
C++:
#include <bits/stdc++.h>
using namespace std;
/**Example 1
*
* 这里提供了和 example 1.py 对应的 C++ 代码
* 对于其中 C++ 不支持的功能,均使用注释隐去了
* 大家可以对比查看
*
*/
int main()
{
string name = "Rain";
int age = 21;
double GPA = 3.86;
cout << name << endl;
cout << age << endl;
cout << GPA << endl;
// 以下两行操作 C++ 中不可实现
// name = 21;
// age = "Rain"
// cout<<age<<" "<<name<<" "<<GPA<<endl;
// 存储不同类型变量的数组 C++ 实现较为复杂,
// 因此在 C++ 中不做实现
return 0;
}
Python:
"""Example 1
这里是 python 的注释。
example 1.cpp 中包含了对应功能的 C++ 实现,大家可以对比查看。
这个代码主要展示了:
1. 声明变量不需要具体的数据类型
2. 变量可以接受任何类型的数据
3. 数组和变量是一样的,不需要声明类型
4. 数组是动态数组,不需要声明长度
5. 数组动态添加元素需要用 .append()
2. 程序输出使用 print()
"""
# 这里也是注释,python 注释有两种
name = "Rain"
age = 21
GPA = 3.86
# 输出一下,
# 等价于 cout<< xxx << endl;
# 或者 System.out.println(xxx);
print(name)
print(age)
print(GPA)
# 改变赋值
name = 21
age = "Rain"
print(age,name,GPA) # 不同的输出方式,观察控制台
# 数组可以存储不同类型变量
student_info = ["Rain", 21]
# Python 支持直接输出数组
print(student_info)
# 数组中添加新变量
student_info.append(3.86)
print(student_info)
# 修改指定元素
student_info[0] = "Sun"
# 输出指定元素
print(student_info[0])
Example 2
- 字典的使用(类比结构体)
- 字典的初始化
- 字典中如何取值、修改
- 字典如何添加新值
- if 以及 while 结构
- 缩进控制代码块
- 必须要加冒号,然后换行
C++:
#include <bits/stdc++.h>
using namespace std;
/**Example 1
*
* 这里提供了和 example 2.py 对应的 C++ 代码
* c++ 中使用了 结构体 来平替 python 中的字典,但是更契合的例子是 STL 的 map
* 感兴趣的同学可以扩展了解
*
*/
struct student_info
{
string name; // string 就是 字符串
int age;
double GPA;
string sex;
};
int main()
{
student_info rain;
rain.name = "Rain";
rain.age = 21;
cout << rain.name << endl;
cout << rain.age << endl;
rain.name = "Sun";
cout << rain.name << endl;
// C++ 中不允许动态添加属性
rain.GPA = 3.86;
// if 结构,要用括号,并且使用 {}
if (rain.age >= 18)
{
cout << "成年了,防沉迷系统解除了" << endl;
}
else if (rain.age >= 12)
{
// 注意这里 else if 和 python 的区别
cout << "可以充钱了!" << endl;
}
else
{
cout << "不满 12 岁,禁止充钱!!" << endl;
}
rain.sex = "female";
rain.age = 16;
if (rain.sex == "female")
{
while (rain.age < 20)
{
rain.age += 1;
cout << "现在" << rain.name << "已经" << rain.age << "岁了!" << endl;
}
cout << "现在" << rain.name << "可以结婚了!" << endl;
}
else if (rain.sex == "male")
{
while (rain.age < 22)
{
rain.age += 1;
// python 中的用法更类似 printf ,但是更简洁
printf("现在%s已经%d岁了!\n", rain.name.c_str(), rain.age);
}
printf("现在%s可以结婚了!\n", rain.name.c_str());
}
else
{
cout << "沃尔玛购物袋" << endl;
}
return 0;
}
Python:
"""Example 2
这里是 python 的注释。
example2.cpp 中包含了对应功能的 C++ 实现,大家可以对比查看。
这个代码主要展示了:
1. 字典的使用(类比结构体)
1. 字典的初始化
2. 字典中如何取值、修改
3. 字典如何添加新值
2. if 以及 while 结构
1. 缩进控制代码块
2. 必须要加冒号,然后换行
"""
# 字典的初始化
rain = {
"name":"Rain",
"age" : 21,
}
# 输出字典的内容
print(rain)
# 修改
rain["name"] = "Sun"
# 另一种方式获取值,等价于 rain["name"]
print(rain.get("name"))
# 添加新值
rain["GPA"] = 3.86
# [] 中可以为变量
label = "GPA"
print(rain)
# 简单的 if else 结构,不需要括号
if rain["age"] >= 18 :
print("成年了,防沉迷系统解除了")
elif rain["age"] >= 12:
# 注意这里 else if 和 c++ 的区别
print("可以充钱了!")
else:
print("不满 12 岁,禁止充钱!")
rain['sex'] = "female"
rain["age"] = 16
# 嵌套的结构,注意观察缩进
if rain['sex'] == "female":
# while 结构
while rain["age"] < 20:
# python 中没有 age++ 这种操作,只能用 += 1 代替
rain["age"] += 1
# 字符串的模板用法,类似 printf ,但是更简洁
print(f'现在{rain["name"]}已经{rain["age"]}岁了!')
print(f'现在{rain["name"]}可以结婚了!')
elif rain['sex'] == "male":
while rain["age"] < 22:
rain["age"] += 1
print(f'现在{rain["name"]}已经{rain["age"]}岁了!')
print(f'现在{rain["name"]}可以结婚了!')
else:
print("沃尔玛购物袋")
Example 3
- for 循环的使用
- 对数组、字典使用
- 实现 C/C++ 中的类似效果
- 函数的定义
- 基本结构,def开头
- 参数列表,只需要起个名字就行
- 返回值,可以为空,也可以返回多个
- 解包操作【很重要,要能够看懂这是在干啥】
Python:
"""Example 3
因为该部分操作与其他语言差异较大,不在单独提供 .cpp 文件,其中的语法使用注释穿插其中
这个代码主要展示了:
1. for 循环的使用
1. 对数组、字典使用
2. 实现 C/C++ 中的类似效果
2. 函数的定义
1. 基本结构,def开头
2. 参数列表,只需要起个名字就行
3. 返回值,可以为空,也可以返回多个
1. 解包操作【很重要,要能够看懂这是在干啥】
"""
student_info = ["Rain", 21, 3.87]
rain = {
"name":"Rain",
"age" : 21,
"GPA": 3.87
}
# 可以输出,但是是整个数组一起输出,如何使用 for 循环一个个输出呢?
print(student_info)
print("---------- 对 列表(list,或者理解为数组) 和字典使用 for ----------")
# python 使用类似Java for each的方式进行循环
# 对于指定的数组,直接这样就可以
# 语法如此,记住即可
for i in student_info:
print(i)
# 字典同样可以使用,但是效果略有不同,此处不做说明,请自己运行
for i in rain:
print(i)
for i in rain:
print(i,rain[i])
print("---------- 如何实现类似 C 语言中的循环? ----------")
"""
如何实现c++中的这种循环呢:
for(int i=0;i<10;i++)
{
cout<<i<<endl;
}
python 中可以通过这种方式:
"""
for i in range(10):
print(i)
# 关于 range,可以划定区间:
for i in range(10,20):
print(i)
print("---------- 二维数组以及 for 循环嵌套 ----------")
# 更改一下数组的定义,变成一个二维函数
student_info = [["Rain", 21, 3.87], ["Sun", 11, 3.85], ["Bulbul", 15, 2.85]]
# 体会一下这个过程
for i in student_info:
print(i)
# 嵌套输出一下
cnt = 0
for i in student_info:
cnt += 1
print(f"第{cnt}个:")
for j in i:
print(j)
print("---------- Python 中的函数 ----------")
"""
现在我们定义一个函数来检查一下年龄
需要传入一个 age,我们返回一段话
"""
def check_age(age):
if age >= 18 :
return "成年了,防沉迷系统解除了"
elif age >= 12:
# 注意这里 else if 和 c++ 的区别
return "可以充钱了!"
else:
return "不满 12 岁,禁止充钱!"
res = check_age(rain["age"])
print(res)
# 更复杂一点
cnt = 0
for i in student_info:
cnt += 1
print(f"第{cnt}个:")
res = check_age(i[1])
print(res)
# 如果需要返回多个值呢?
# 这里暂时没有想到很好的例子,大家将就看吧
print("---------- 对函数的返回值解包 ----------")
def get_details(info):
name = info[0]
age = info[1]
GPA = info[2]
# 多个返回值是被允许的
return name,age,GPA
# 使用一个参数接受返回值
for i in student_info:
all_info = get_details(i)
# 打印的时候注意和数组的不同
print(all_info)
# 解包操作接收返回值
# 理解多个返回值可以这样操作即可!
# 看到这个操作能够理解
for i in student_info:
stu_name, stu_age, stu_GPA = get_details(i)
print(stu_name,stu_age,stu_GPA)
结语
以上就是关于 python 的一些基本操作,基本覆盖了 Lab1 中代码所涉及到的内容。
对于 Lab1 中关于 plt 的内容,暂时可以不做了解,知道这样可以画图即可,有时间的同学可以搜索 matplotlib 学习相关内容。
对py记忆最深的大概是“一切皆对象”的思维,第一次听到这个观点使是用py最普通的概念变量来解释的,一个变量也是一个对象,大概是我对面向对象编程和面向过程编程有那么一点点认识的起源
对于面向对象的编程语言其实也有很多不同。有些语言并不坚持一切皆对象的概念,有些则是将一切皆对象做到了纯粹。特别是在学了se之后会觉着 oop 只是软件工程发展的阶段和产物,这更像是一种思想的体现。