1. 一文入门Python基础教程

1 python入门介绍

python是目前最流行的一门语言,这可以从TIOBE的榜单中看出一二:

image-20240307214015387

作为一门面向编程新人的语言,它的用户量在如今已经达到了一种惊人的地步,甚至完全可以说它是目前使用人数最多的编程语言。

相比于其它语言而言,python主要的特点就是“简单”,如果你了解过C/C++语言或者其它语言,应该会理解这个“简单”一词的分量。

但这并不是说python这门语言就真的简单至极,不用学也会。

这所谓的“简单”,都是与其它语言对比而来的。

如果你原本就是什么都不会的小白,那就最好忘掉 “python简单”这句话,因为作为小白,你根本就没有任何可比较的基础,随便遇到一个问题,都会让你感受到一种“从入门到放弃的窘境”。

很多自学python、并且只会python的人,大多数可能都是处于一种云里雾里的状态,根本不清楚代码的运作逻辑。

知道它能做这件事,却不知道它为什么能做到这件事,也就没有能力将它做到更好,这也就是常说的“知其然,而不知其所以然”

比如python中最常用的一个print函数,为什么它能把字符打印到终端上?我能用它把字符串打印到文件、或者其它别的地方吗?它真的就是你一调用它,它就会立马将其打印出来吗?

1.1 什么是编程语言

编程语言,说白了就是我们与计算机沟通的一门语言。

首先我们需要明白一个基本的事实,那就是无论是计算机还是手机,它们本质上都只认识二进制,也就是0和1,除此之外的一切它都不认识。

而对于我们人来说,学习自然语言(比如中文、英文)会比较容易,但想要学习用二进制来和计算机交流,那就有点强人所难了。

早期的程序员与计算机打交道,就是通过手写二进制来实现的,那绝对是一段痛苦的时期。

为了让更多人能够使用上计算机,于是后面就有了编译器(解释器),它的作用就是将特定的一门人可以看懂的语言,转换为计算机可以看懂的二进制。

比如C/C++语言,需要依靠C/C++的编译器,Java语言,就需要Java的编译器,而我们的Python语言,就需要用到Python的解释器。

因为对应的编译器(或解释器)只认识它自己规定的格式,所以我们需要去学习对应的语言格式,才能将其交给对应的编译器或解释器进行编译、解释,最后让计算机去完成对应的任务。

注意这里说的:Python语言用的“解释器”,它与“编译器”的区别在于,它并不会像C/C++语言那样,可以直接将你写的代码编译成为可执行文件,比如windows上的.exe等。

你写的python代码,只能在有python解释器的情况下,才能在计算机上运行。

这就是很多新手疑惑的点,为什么自己下载的那些别人写的程序都是直接可执行的,而你用python代码写的怎么就不行呢?

当然,python也是有办法可以将代码打包成为可执行文件的,这个后面会提。

1.2 python解释器

这个直接去python的官网下载最新的解释器就行了:python

image-20240307214809427

这个得看你个人情况,因为我相信大部分人用的都是windows电脑,所以这里就只展示window平台的方式了(其它平台都差不多)。

我就直接下载的当前显示的最新版本,当然你也可以点击windows进去下载其它版本的,区别其实也不大,都可以。

下载后,双击运行这个程序,即可开始安装python的解释器:

image-20240307214919702

最好把下面的那个添加到PATH给勾上,以后如果想要用的时候,就会很方便(就可以直接在控制台调用、运行代码)。

然后点击上面箭头所示的,立即安装即可。

至于下面的那个,是自定义安装,等你以后了解了python的各种基本原理,也可以使用下面的自定义安装,可以去除掉一些东西,或者更改安装的路径等等,为了简化流程,这里就不进行演示了。

安装完成后,现在你打开控制台(win+R快捷键可以弹出命令窗口,然后输入cmd,再按Enter,即可进去):

image-20240307215026901

进入控制台后,输入py(或者python),即可进入python的解释器环境:

image-20240307215112048

理论上来说,现在你就已经可以进行编程,直接在这里写一句代码,然后执行一句,比如打印一个字符串:

print('hello world')

输入这个代码,然后按下Enter键,就可以执行了:

image-20240307215137329

但这样你应该会觉得有点麻烦,所以我们还可以用记事本编程,下面我们再将多行代码写在一个文本文件中:

image-20240307215514383

文件名为1.txt,代码如下:

print('hello world')
print('hello python')
print('www.kucoding.com')

保存后,我们就可以在控制台直接运行这个文件:

image-20240307215630216

注意前面的路径,因为我的这个文件保存在了桌面,而桌面又被我放在了D盘,所以这里是在D:\Desktop路径下运行的。

至于控制台相关的基础内容,不懂的可以参考文章:程序员常识

1.3 IDE环境

上面我们也看到了,其实我们是可以直接在控制台、或者记事本里面写代码的,并让python的解释器来执行这些代码。

但你很快会发现,这样写代码的效率是极其低下的,而且还很容易出错。

所以这时候我们就需要一个集成开发环境(IDE)了,它的作用就是将“代码编辑”、“代码查找”、“代码提示”、“代码编译/解释”等等一些列功能集成到一个软件中,可以极大的提高我们程序员的开发效率。

IDE并不唯一,目前最流行的一个python IDE为pycharm,它是完全免费的。

但由于python本身仅仅只是一门脚本语言,很多时候我们只是想要做一点简单的工作,并不需要完全形态的IDE环境。

那么你就可以和我一样,使用vscode安装相应的python插件来实现一个简单的IDE环境,或者国内的trae编辑器也不错。

vscode的安装很简单,官方下载链接为:Download Visual Studio Code

如果你是windows系统,那么个人推荐你直接下载下图所示的安装包:

image-20240307220338981

至于其它系统环境,可以自己选择合适的版本。

vscode本身仅仅只是一个更高级的“记事本”一样的编辑软件而言,为了能让其发挥更加强大的功能,我们还需要为其安装相关插件。

安装完成后,打开vscode,就可以按照下图所示的步骤来安装python相关的插件了:

image-20240307221138479

上图两个插件可以说是必装的,然后还有一个调整python代码格式的插件,也可以安装一下:

image-20240307221252236

至此,我们就完成了python开发环境的搭建,你现在可以新建一个记事本,并将其文件后缀改为.py,也就是代表这个文件将用写python代码的意思,最后将这个文件拖进vscode中、让其打开:

image-20240307221540887

就像上面这样,现在我们写python代码,就会有智能提示了:

image-20240307221643292

此时只要按Enter键,就会自动为我们补全代码。

并且最重要的是,它还有函数的参数提示:

image-20240307221800034

写完代码后,我们想要运行它也非常简单,就像前面说的那样,你可以在终端进入这个文件所在的文件夹路径,使用命令py testpy.py运行这个脚本文件即可。

又或者直接点击右上角的三角形:

image-20240307222047080

它会自动完成这一步骤,用python解释器来执行该脚本文件。

vscode非常强大,自带了终端页面,所以你也不需要每次都自己去在电脑上启动、运行python脚本。

2 基本数据类型

学习一门编程语言,第一件事就是要熟练掌握这门编程语言的基本数据类型,因为以后你会随时看到它们。

前文中我们用到了python中的一个最基本的打印函数print,它的作用就是将一个字符串或者其它对象,打印到屏幕上。

用法很简单,后面会大量用到它,可以先简单熟悉一下它的用法,不过它也有很多的细节,我会在后面对它进行详细的介绍。

所谓数据类型,也就是数据的类型,简单来说,就是python可以表示哪些类型的数据。

比如,数字类型可以用来操作数字、布尔类型用来表示真假、列表类型用来存放一组关联的元素等等。

当然,上面这介绍的只是表象,不同的数据类型,真正的本质在于所占用的内存大小不同。

你可以在windows电脑的任务管理器中看到本机电脑的内存:

image-20240309095447824

你电脑上所有的程序,包括我们马上要学习的python语言,最终都是存放在你的电脑内存中执行的。

而各种数据类型的所占用的内存大小并不一样,一般我们会尽量选择占用内存较小的数据类型来满足我们的实际需求。

不过由于python这门语言的特性,实际上并不用太顾及这个,因为它本身就是为大众开发的一门语言,这里提到内存,主要还是为了让你对你写的每行代码,有更直接的感触。

内存大小可以通过函数sys.getsizeof来获取,要使用这个函数,需要你导入一个模块:

import sys

比如下面这样:

import sys

a=10 #一个数字类型的变量
size=sys.getsizeof(a) #获取这个变量的大小
print(size) #打印出大小

这段简短的代码主要涉及到了变量函数模块注释的使用,会在后面分别对其进行介绍。

2.1 变量

“模块”与“函数”的内容会在后面再介绍,而“变量”,也就是上面这段代码中的a,简而言之,就是存放各种数据类型的一个地方,并且之后你还可以随意修改它里面的值。

当然变量名你可以随意写,不一定非要是a,但要注意以下几点:

  • 变量名只能包含字母、数字和下划线,同时不能以数字开头。
  • 变量名区分大小写。

本质上来说,变量名就代表了一块内存,当你操作上面代码中的a时,实际上就是在操作一块内存。

比如你可以用函数id来获取它的地址:

a=10 #一个数字类型的变量
addr=id(a) #获取a变量的地址
print(addr) #打印地址

2.2 注释

至于注释就简单了,就像上面这段代码这样,#符号后面跟着的就是注释。

写注释与不写注释有什么区别吗?

对于python的解释器而言并没有什么区别,因为它根本不会管你的。

注释的作用,是给我们程序员看的,就比如上面那段代码,如果我不写后面的注释,你能知道我在干嘛吗?

这就是注释的作用,养成写注释是一个很好的习惯,因为即使是自己写的代码,只要过个几个月,你自己可能都不知道当初自己写的是什么

正如你说见,单行注释,只需要在前面写上一个#号即可。

但有时候我们会有写多行注释的需求,比如后面章节我们将要提到的模块与函数,注释的内容一般一行写不下。

当然,你仍然可以继续用#号,就像下面这样:

#第一行注释
#第二行注释
#第三行注释
#第四行注释

但这样明显很不方便,如果我现在需要复制注释里面的内容,就很麻烦,需要一行一行的复制,如果多行一起复制,会有前面的#号。

所以这时候我们就可以使用多行注释的语法,就像下面这样:

'''
第一行注释
第二行注释
第三行注释
第四行注释
'''

任何在三个单引号之间的,都为注释内容,解释器不会管你的,这样就很方便我们写多行注释了。

2.3 数字

如果你读过高中(或者初中?)应该知道数字大抵可以分为三种类型:“整数”、“小数”以及“复数”。

python中默认就存在这三种数据类型,你可以很方便的表示它们:

a=10 #整数
b=3.14259 #小数
c=10+20j #复数

在vscode中,只要你将你的鼠标悬浮在变量名称上面,就会自动弹出一个框,给你解释这个变量名是什么类型的:

image-20240309100112184

比如这里我悬浮在c上,就会弹出上面的框,前面的(variable)代表这是一个变量,后面的c是变量名,最后的complex就是该变量的类型,也就是“复数”。

如果你看a和b,就会发现整数、小数的类型分别为:intfloat

其中int是整数integer单词的缩写,而float意思是浮动,因为在计算机中我们一般称小数为浮点数。

有数字肯定就会有运算,加减乘除这些最基本的运算都是有的:

a=10 #整数
a1=a+a 
a2=a-10

b=3.14259 #小数
b1=b*b
b2=b/10

c=10+20j #复数
c1=c+c

加为+,减为-,乘为*,除为/

当然,python中的运算符并不仅仅只有这一点,这块内容我们在后面专门聊一聊。

你可以直接用print函数打印它们来获取运算的结果:

a=10 #整数
a1=a+a
print(a1)

b=3.14259 #小数
b1=b*b
print(b1)

c=10+20j #复数
c1=c+c
print(c1)

2.4 字符串

任何一门编程语言中,最常见的一个类型便是字符串了,因为它可以表示任意字符,并且操作它。

比如你写的任何报告、作文、小说,本质上都是字符串,只要将其全部读取到python中,就可以对它们进行非常方便的操作。

创建一个字符串变量很简单,只需要写一个变量名,让它等于一个字符串即可:

s='str1'
s1="str2"

字符串可以用上面两种方式表示:’‘""

也就是说,单引号、双引号均可,不过一般习惯上我们可能更喜欢用单引号。

当你鼠标悬浮在变量上,就可以看到它的类型了:

image-20240309100444692

虽然vscode这里显示的是Literal,也就是“字面量”的意思,但实际上你完全可以把它看做字符串类型,也就是str,即单词string的缩写。

因为你可以在该变量身上调用任何属于str类型的函数,这个后面会提。

2.5 布尔

布尔类型,也就是我们常说的真与假,真用True,假用False

使用起来非常简单:

b1=True
b2=False

悬浮在其上,可以看到它的类型为Literal

image-20240309100712097

虽然“字面量”和“变量”代指两种不同的类型,但在python中你完全可以忽略两者的区别。

“字面量”代指=右边直接写出来的‘字符串’‘布尔值’等等值,而变量指的是=左边的变量名,这两者有一定的区别,但在python中我们无需理会。

实际上它的类型为bool,即boolean的简写。

它的主要作用在于判断,这个我们会在后面的流程控制语句中进行介绍,这里只需要了解一下布尔类型的运算即可。

一般来说,布尔类型有三种运算:或、与、非

分别对应着:orandnot

使用方法如下:

b1=True
b2=False
b3=b1 and b2 #b1与b2做与运算,一假为假,所以结果为False
b4=b1 or b2 #b1与b2做或运算,一真为真,所以结果为True
b5=not b1 #非运算,b1为True,那么结果就为False

print(b3,b4,b5) #打印结果

这个读过初高中的应该都知道,我这里就不再赘述了,只是要熟悉一下它的用法而已。

需要注意的点是print这个打印函数,如果你想要打印多个对象,就按顺序写在小括号中即可,各个对象要用,进行分隔

2.6 列表

列表,看字面意思应该也能猜出来,它能存放一系列的值:

arr=[1,True,3.24,1+10j,'string']
print(arr)

表示方法就是让一个变量等于一个[],而这个中括号中就存放你想要存放的值即可(任意数量,各个值之间用,分隔)。

如果你此刻将鼠标悬浮在其上,就会看到它的类型:

image-20240309101207500

这里的list,就代表着它是一个列表。

你可以直接像上面那样,用print函数一次性将它们全部打印出去,也可以像下面这样,分别进行打印:

arr=[1,True,3.24,1+10j,'string']
print(arr[0])
print(arr[1])
print(arr[2])
print(arr[3])
print(arr[4])

我们可以通过下标:[数字]的形式,来访问对应的数据。

需要注意的是,下标是从0开始数的,列表中有5个对象,所以下标的范围就是0-4

列表同样有很多常用的函数,鉴于同样的原因,我将在后文对其进行详解。

它的使用场景在于存放一组相关联的数据,比如一个学生的姓名、年龄、性别、电话等等,就可以存放在同一个列表中,方便以后存取修改。

2.7 元组

元组其实与上面提到的列表差不多,它同样也可以存放一组数据,使用方法如下:

tup=(1,True,3.24,1+10j,'string')
print(tup)

从表面上看,它与列表的唯一区别可能就是列表中的中括号,而它用的小括号,将鼠标悬浮在变量名上:

image-20240309101333664

可以看到,元组的类型为tuple,其后还跟着它内部各个值的类型。

不用理会Literal类型,只要出现True、False,那它就是bool类型,只要出现字符串,那就是str类型,只要出现整数,那就是int类型。

同样也可以用print直接打印它,得到结果:

(1, True, 3.24, (1+10j), 'string')

同样也可以用下标访问对应位置的数据:

tup=(1,True,3.24,1+10j,'string')
print(tup[0])
print(tup[1])
print(tup[2])
print(tup[3])
print(tup[4])

但既然有列表与元组两种类型,那自然会有一定的区别,而这区别就是,元组是不可变的,而列表是可变的

比如下面这段代码:

arr=[1,True,3.24,1+10j,'string']
tup=(1,True,3.24,1+10j,'string')

arr[1]=False #正确,列表可变
tup[1]=False #错误元组不可变

这里的意思就是,将下标为1的地方(也就是第二个元素:True)重新赋值为False

如果你运行这段代码,就会看到python解释器报错了:

image-20240309101610828

意思就是说,元组对象不支持对内部的项进行赋值操作。

虽然它们的区别并不仅仅只是体现在这一个操作上,但其本质都是一个意思:元组不可变,而列表可变。

所以如果你觉得一组数据不应该被别人修改,那就用元组,而其余的情况,都直接用列表就好了,无需考虑太多。

2.8 集合

紧接着是集合,看名字也能大致明白她是什么意思,就是数据的集合

它的使用方法与上面的列表与元组很像:

s={1,True,3.24,1+10j,'string'}
print(s) #直接打印

其类型就是set

image-20240309101730356

不同之处在于,它用的{},并且不能直接用下标进行访问:

s={1,True,3.24,1+10j,'string'}
print(s[0]) #错误,集合不能用下标进行访问

我们只能通过后面将要介绍的循环来遍历它,它的主要特性就是:不允许添加相同的元素

也就是说,我们一般可以用它来完成去重的操作。

比如曾经我下载过几百M的字典,里面有大量重复的密码(几十万个)。

想要去重,那就可以直接将它们全部读入一个集合中,集合就会自动完成去重,最后我们再循环遍历它,将里面的结果取出来就可以了

这里只是简单介绍一下它的概念,因为没有实际操作的话,其实学过也会很快就忘记的。

实际上它的应用并不仅限于此,其对应于数学上的“集合”概念,所以它是可以很方便的完成“集合”相关操作的,比如获取两个集合的交集等等。

2.9 字典

最后一个是字典了,它的应用场景更多,使用方法如下:

o={
    'name':'yushi',
    'age':100,
    'sex':'man'
}
print(o) 

注意,它和上面的集合一样,同样是使用的{}包裹元素,同时可以看到,字典的类型为dict

image-20240309101949452

至于后面的中括号中,仍然指代的是参数的类型,前面的str代表“键”为字符串类型,后面的any类型则用来泛指“任意”类型,也就是“值”的类型任意。

由于字典的元素为“键值对”,也就是像上面写的那样,用,分隔每一个键值对元素,而每个键值对的键与值,则用:分隔,前面的是键,后面的是值,我们可以通过键来获取对应的值。

就像下面这样:

o={
    'name':'yushi',
    'age':100,