Python基础-01概论
author:john_xh,公众号:john.xh
目前python在爬虫、数据分析、数据科学、机器学习等领域被广泛使用。在2025年2月TIOBE指数中,python也是因其易入门、强大的生态等原因,以23.88%评级稳居编程语言榜首。为了帮助感兴趣的朋友进一步了解python的应用,我们将从python基础板块出发,进一步拓展python爬虫(包含js逆向和app逆向)、机器学习、Web开发(主要是Django)等板块。
1 Python变量与数据类型
1.1 变量
我们的个人电脑又称为计算机,顾名思义,电脑是一台用于计算的机器,它按照既定的规则,对我们输入的数据进行计算,并返回结果。在计算机中,数据可以分为常量和变量两类,常量就是指固定不变的数据,比如圆周率等于3.1415....,变量是指可以根据具体情况发生变化的数据,比如不断变化的股票价格。由于变量的值是不固定的,为了方便管理,我们可以给它取一个名字,这样不管它怎么变,我们都能通过名字找到它。为了统一管理,我们同样也会给常量取一个名字。在python中,我们使用变量名 = 数据的方式给数据取名,这一过程我们称之为赋值,变量名也可以称之为标识符。通常,python的变量名由字母、下划线和数字组成,且不能以数字开头。
""" 变量的定义 """
PI = 3.1415 # 定义常量PI等于3.1415
num1 = 1 # 定义变量num1等于1
""" 变量的命名 """
test = 1 # 合理
_test = 1 # 合理
Test = 1 # 合理
_Test = 1 # 合理
1num = 1 # 不合理,数字开头
常量和变量都用变量名 = 数据的方式赋值,那么我们怎么知道一个数据是常量还是变量呢?通常python的命名会有一些规范性要求(不是强制要求)。
-
见名知意: 变量名尽量做到看一眼就知道这个数据的作用,比如
age = 18代表age这个变量里储存数据代表年龄18岁,john_age = 18代表名叫john的人,他的年龄是18岁。 -
命名方式
- 驼峰命名法:分小驼峰式命名法和大驼峰式命名法。小驼峰式命名法,即 第一个单词以小写字母开始;第二个单词的首字母大写,例如:
myAge。大驼峰式命名法,即每一个单字的首字母都采用大写字母,例如:FirstName、LastName。 - 下划线命名法:用
_来连接所有的单词,比如get_information
- 驼峰命名法:分小驼峰式命名法和大驼峰式命名法。小驼峰式命名法,即 第一个单词以小写字母开始;第二个单词的首字母大写,例如:
通常python的变量名和函数名使用下划线命名法,类使用大驼峰命名法,全局变量(定义在全局上的常量)使用全部大写。此外,部分名字已经被python征用了,这些被征用的名字我们称之为关键字,用于实现一些特殊功能。我们在自己写代码的时候,通常是不允许取和关键字相同名字的变量名。
python关键字:
False, None, True, and, as, assert, async, await, break, class, continue, def, del, elif, else, except, finally, for, from, global, if, import, in, is, lambda, nonlocal, not, or, pass, raise, return, try, while, with, yield
关键字可以不用专门去记忆,但前期可以先熟悉一些常见的,如not, False, None, True, def, class, if, elif, import,其它的后期也会经常看到,很容易形成记忆。
1.2 数据类型
我们在日常生活中可以看到各式各样的数据,比如文本、整数、小数,我们知道这些数据本质是不一样的,是不同类型的数据。同样,如果我们想在python中表示这些数据,理应有不同的数据类型。python常见的数据类型包括:
int整型:用于保存整数,直接使用数字定义a = 1。
float浮点型,用于保存小数,使用带小数点的数字定义a = 1.0。
boolean布尔类型,用于保存True或者False,a = True。
string字符串类型,用于保存文本,文本用"{文本}"保存起来,如a = "1"。
1.3 数据结构
List列表类型,用于保存一堆数据, 使用[]保存,数据之间用,分割,如 [数据1, 数据2, 数据3...],a = [1, 2.0, "3"]。
Tuple元组类型,用于保存不可修改的堆数据,使用()保存,数据之间用,分割,如 (数据1, 数据2, 数据3...),a = (1, 2.0, "3")。
Dict字典类型,用{}保存,数据之间用,分割,数据格式key: value,如a = {"name": "john", "age": 18}
set集合类型,用{}保存,数据之间用,分割,内部无序,且数据不能重复(重复数据会被自动删除)
我们可以使用type(常量或者变量),来查看数据类型
print(type(1)) # <class 'int'>
print(type(1.0)) # <class 'float'>
print(type("1")) # <class 'str'>
1.4 变量的进一步理解
计算机能够以二进制的形式存储数据,比如我们用0101能够代表5(),现在数字我们能表示了,但是文字应该如何表示?不难想到,既然计算机只能计算数字,那我们把数字和文字用某种方式联系起来,那文字不就可以用数字来代表了吗,聪明如你,这就是计算机的编码,将数字和文字一一对应的集合我们称之为编码集,常见的编码集有UTF-8,gbk等等。现在我们已经能够用数字来代表文字了,这就意味着只要能建立映射关系,所有的数据都可以变成数字。如同学习到的知识要存储到大脑,我们已经知道如何用数字表示数据了,那么我们应该如何将数据存储在计算机中,计算机又如何知道这个数据储存在哪个地方?
- 我们首先关注第一个问题,如何将数据存储在计算机中(以下内容涉及内存的知识,仅作为知识拓展)
我们知道计算机内部是采取二进制来记录数据的,比如1是1,2是10,4就是100。每一个位置上的数字只有0和1两种选择,我们称这样一个位叫做bit(比特)。现在1占一位,2占两位,4占三位,接下来还会有更多数据,我们每一次都给1分配一个位置,2分配两个位置,这么多数据,位数肯定是不一致的,我们很难做到统一管理,每次记录数据的时候还要计算给数据多少个位数也会增加计算负担。因此我们亟需一种给变量统一分配bit的方式。计算机最早出现在美国,当时他们的编码集(ASCII)只包含128个字符,也就是可以用0~127来代表这128个字符,8个bit的范围是0-255,完全能够涵盖ASCII的字符需求,所以我们一般将8个bit作为存储容量的基本单位,称之为byte(字节)。有了基本单位,我们就有了一套统一的标准,比如1就是00000001,2就是00000010,我们不用每次存储数据的时候再记录位数,可以安心做计算了。
你可能会产生这样的疑问,既然一个数字能够映射成一个文字,比如ASCII表中会用数字 65来代表'A',那么以后65都是代表'A'了吗,如果我们想计算65+10,计算机会不会蹦个"A10"出来?这问题就涉及你告诉计算机如何解释你的变量了,也就是我们常说的声明。我们以静态语言C++为例。
int number = 65; // output:65
// 这个表达式的意思是,向计算机申请4个字节的存储空间(也就是32个bit),并且给这个存储空间取一个number的名字,然后int告诉计算机,这段数据是个整数,即“这是数字65,不是字符'A'”。
char str = 'A'; // output: 'A'
// 这个表达式的意思是,向计算机申请1个字节的存储空间(也就是8个bit),并且给这个存储空间取一个str的名字,然后char告诉计算机,这段数据是个字符串。
// --------------------------------------
char str = 65; // output: 'A'
// 这个地方虽然给str赋值了65,但是char告诉计算机,“这是不是数字65,要用字符编码集来转换,我不要数字65,你得把它翻译成字符,也就是'A'”
int number = 'A'; // output: 65
// 这个地方虽然给number赋值了'A',但是int告诉计算机,“这是不是字符'A',用字符编码集来转换,我不要字符'A',你把它翻译成数字,也就是65”
从上面的例子可以看出,区分'A'和65,关键在于你告诉计算机怎么解释它。python作为动态语言没有这么麻烦,只需要记得数字直接写数字,字符串需要放在"{文本}"文本中就行了。
- 第二个问题,计算机又如何知道这个数据储存在哪个地方
我们认识了小明这个好朋友,下次还想找他玩的话就得知道他住在哪里,计算机存储变量也是这样,当我们想要再次访问这个数据的时候,我们需要知道这个数据的住在哪里,也就是我们要知道它的地址。通常计算机会给变量找一个地址,方便我们去访问。但是计算机给出的地址是一个十六进制数,如0x002b0023,如果我们每次访问一个整数1,还要来记这么一长串数字,那生活会变得不幸,所以我们变提出了取别名的方式,也就是我们上面说的变量命名。所以变量名和地址都可以访问储存在计算机及中的数据。
你可能会在其它文章中看到python的变量其实是一种引用。但是本文不引入这些名词,仅从地址的角度帮助大家理解python的变量。从上面的介绍,我们发现,好像变量名和地址没有什么区别,都是能够访问数据的,所以接下来,我们不严格的认为python的变量名就是地址。
那么接下来网上经常问你是否真正理解python的测试题就很容易理解了。
a = 10
b = a
b = 1
问上面三行,如果我们打印a,a的值会是10还是1?答案是1,我们逐行解释
a = 10 # 这个地方将10这个整数对象的地址给了a,所以a真正的值是0x7ff9c2d59448
b = a # 这个地方将a这个地址赋值给了b,所以b真正的值是0x7ff9c2d59448
b = 1 # 这个地方将1这个整数对象的地址给了b,所以b现在真正的值是0x7ff9c2d59328
所以从上面的例子,我们看到a的值还是0x7ff9c2d59448,但是b的值变成了0x7ff9c2d59328,也就是a还是10,但是b已经变成了1。
像不可变类型(如整数、浮点数、字符串、元组等),都可以这样去理解,每一次的等号都是独立的赋值,只影响自己,不影响别人。
但是当数据是可变类型(如列表、字典、集合等)的时候,那情况又不一样了。我们也举例子来说明。
a = [1, 2, 3]
b = a
b.append(4) # append方法可以在列表后增加括号内的数据,比如现在b就变成了[1, 2, 3, 4]
那么现在a的值是[1, 2, 3]还是[1, 2, 3, 4]?答案是[1, 2, 3, 4],我们依旧逐行解释。
a = [1, 2, 3] # a的值是0x27601729dc0
b = a # 将a赋值给b,b的值变为0x27601729dc0
b.append(4) # 没有任何赋值操作,b的值依旧是0x27601729dc0
所以从上面的例子,我们看到a的值还是0x27601729dc0,b的值也是0x27601729dc0,所以对b的修改也就是对a的修改,因此a的值是[1, 2, 3, 4]
至此,python中的变量部分我们已经结束了,这一部分重点需要知道一些常见的数据类型(整型、浮点型、字符型、布尔型),达到这个目标,这一章便顺利结束了!进一步呢,如果你有兴趣的话,希望你能够记住python的变量名代表地址的这个观点,因为后面的函数和类本质上也如此。