Python:快速入门

Python:快速入门

为了辅助 Intelligence Systems 课程,本文提供一个快速理解 Python 代码的简易教程,部分表述和举例并不严谨,见谅。

对于基础语法、结构部分,文章会提供一些 c/c++ 的例子以供参考。

注意,不必纠结为什么这么写,语法只需要记住即可。

有点儿不一样?

Python 和以往学习的 C/C++, Java 略有不同,他是一种 解释型语言 因此在编写和运行上有一些不同,此处列举几处十分明显的不同:

  1. 没有主函数 main
    1. 可以直接编写代码,执行时按顺序执行
  2. 变量不需要定义类型(动态类型语言)
  3. 语法更加简洁
    1. 不使用花括号 {} 来标识代码块
      1. Python 通过缩进来标识代码块(代码作用域)
    2. 不需要使用分号 ;
  4. 有丰富的第三方库,并且导入简单、管理便捷
    1. 第三方库以面向对象的形式封装,可以通过简单的接口调用实现复杂的功能
    2. 例如 matplotlib 可以对数据进行便捷的可视化

针对这些不同下面通过具体的代码,使用 C/C++ 进行比较以便于理解。

注意,Python 可以直接通过解释器(小黑框)执行,但是这里仅讨论将 Python 编写为程序(脚本)然后再执行的情况,也就是我们需要编写一个 .py 程序,然后再点绿色的小三角运行程序。

IO 及变量

  1. 变量声明
  2. 基本数据类型
  3. 输入输出
  4. 字符串

Python 的变量声明

Python 不需要显式的声明变量为 int,double 或者 string(字符串)。
可以形象的理解为:
C 语言的变量是大小不同的杯子,酒盅用来装白酒、高脚杯装红酒、玻璃杯子装啤酒等等,不同类型的杯子需要装不同的东西,使用者必须严格执行这个标准。
Python 的变量是一个万能的大桶,这个桶可以装任何东西,白酒、红酒、啤酒都可以,并且装完白酒后同一个桶可以继续装红酒或者啤酒,甚至你可以在桶里再放一个桶。

如果你学习过 C++,也可以认为 Python 中的类型都是 auto 类型的。

Python 中的变量都是万能变量!

例如,如果我们需要三个变量保存:

  1. 姓名(字符串)
  2. 年龄(整型变量)
  3. 学分绩点(浮点型)

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中数组的异同

  1. 相同点:
    1. 都通过 [] 访问元素,并进行修改
    2. 下标都从 0 开始
  2. 不同点
    1. 与变量一样,不需要声明类型
    2. 同一个数组中可以存放不同的类型
    3. 不需要声明数组长度
    4. 添加元素需要调用 .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 的输出,将在下一节中介绍,这里可以复制并运行,然后理解运行结果即可.

上述代码中涉及到了字典的:

  1. 初始化
  2. 添加新值
  3. [] 访问元素
  4. .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"]}岁了!')

控制、循环结构

  1. if、elif、else
  2. while
  3. for

在该部分大家需要习惯:

  1. 使用缩进表示的代码块
  2. 语句结束后需要添加冒号 :

if语句

需要注意:

  1. if 条件不需要括号
  2. 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

  1. 声明变量不需要具体的数据类型
  2. 变量可以接受任何类型的数据
  3. 数组和变量是一样的,不需要声明类型
  4. 数组是动态数组,不需要声明长度
  5. 数组动态添加元素需要用 .append()
  6. . 程序输出使用 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

  1. 字典的使用(类比结构体)
    1. 字典的初始化
    2. 字典中如何取值、修改
    3. 字典如何添加新值
  2. if 以及 while 结构
    1. 缩进控制代码块
    2. 必须要加冒号,然后换行

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

  1. for 循环的使用
    1. 对数组、字典使用
    2. 实现 C/C++ 中的类似效果
  2. 函数的定义
    1. 基本结构,def开头
    2. 参数列表,只需要起个名字就行
    3. 返回值,可以为空,也可以返回多个
      1. 解包操作【很重要,要能够看懂这是在干啥】

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 学习相关内容。

评论

  1. 6 月前
    2024-6-16 23:50:40

    对py记忆最深的大概是“一切皆对象”的思维,第一次听到这个观点使是用py最普通的概念变量来解释的,一个变量也是一个对象,大概是我对面向对象编程和面向过程编程有那么一点点认识的起源

    • 博主
      coolarec
      6 月前
      2024-6-17 1:16:37

      对于面向对象的编程语言其实也有很多不同。有些语言并不坚持一切皆对象的概念,有些则是将一切皆对象做到了纯粹。特别是在学了se之后会觉着 oop 只是软件工程发展的阶段和产物,这更像是一种思想的体现。

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇