03 - 变量与数据类型

发布时间:2026/5/25 20:35:13

03 - 变量与数据类型 03 - 变量与数据类型变量是编程里最基础的概念相当于你往电脑里存东西的容器。这章我们把变量的命名规则、Python 的几种基本数据类型都过一遍。变量是什么说白了变量就是一个有名字的盒子。你往里面放个东西以后想用这个名字就能取出来。name小明age25print(name,今年,age,岁)这里name和age就是变量。不是等于的意思而是把右边的东西放进左边的盒子里。跟数学里的等号不一样别搞混了。x10x20# 重新赋值原来的 10 就没了print(x)# 20变量可以随时重新赋值新值会覆盖旧值。命名规则变量名不是随便起的有几条硬性规则只能包含字母、数字、下划线不能以数字开头不能用 Python 的保留字比如if、for、class这些# 合法的user_name小明age230_privateTrue# 不合法的2nd_place银牌# 不能数字开头user-name小明# 不能用横杠for10# for 是保留字规则之外还有习惯。Python 社区约定变量名用小写字母加下划线# 推荐first_name小明total_price99.9# 不推荐虽然不会报错firstName小明# 驼峰命名是 Java/JS 的习惯FirstName小明# 大写字母开头一般留给类名起名字的时候尽量起有意义的。a 10; b 20这种写完了过两天你自己都不知道是什么。Python 的基本数据类型Python 里有几种基本的数据类型我们一个个来。整数int就是没有小数点的数字正数负数都行age25temperature-10population1_400_000_000# 可以用下划线分隔提高可读性1_400_000_000这个写法可能你没见过——Python 允许在数字中间加下划线当分隔符纯粹是为了好读跟1400000000完全等价。浮点数float就是带小数点的数字price19.99pi3.14159weight0.5注意一个坑浮点数运算可能不精确。print(0.10.2)# 0.30000000000000004不是 Python 的 bug几乎所有编程语言都有这个问题。因为电脑用二进制存小数有些十进制小数没法精确用二进制表示。就像 1/3 用十进制只能写成 0.333… 一样。如果真要做精确的小数运算比如算钱用DecimalfromdecimalimportDecimal price1Decimal(0.1)price2Decimal(0.2)print(price1price2)# 0.3精确的字符串str用引号包起来的文字单引号双引号都行name小明city北京两种引号没什么区别只是方便你在字符串里面用另一种引号# 字符串里有双引号外面就用单引号sentence他说你好# 反过来也行sentence2Its a good day如果两种引号都不够用可以用反斜杠转义sentence3他说\你好\不过说实话这种写法看着别扭能避免就避免。布尔值bool只有两个值True真和False假。注意首字母大写。is_studentTrueis_adultFalse布尔值经常用在条件判断里后面会详细讲age20is_adultage18# 20 18 是 Trueprint(is_adult)# True有意思的是True和False在 Python 里本质上就是1和0print(TrueTrue)# 2print(False*10)# 0虽然一般不会这么用但知道这个特性有时候能帮你理解一些代码。空值NoneTypeNone表示什么都没有“空”“不存在”。resultNoneprint(result)# None什么时候用呢比如一个函数暂时没有结果或者一个变量还没确定值可以先给它赋None。注意None不是0不是空字符串不是False。它就是None独一无二的无。类型转换有时候你需要把一种类型变成另一种类型。Python 提供了几个内置函数来干这事# 字符串转整数numint(42)print(num8)# 50# 字符串转浮点数pricefloat(19.99)print(price*2)# 39.98# 数字转字符串age25message我今年str(age)岁print(message)# 转布尔值print(bool(1))# Trueprint(bool(0))# Falseprint(bool())# False空字符串print(bool(hello))# True非空字符串关于bool()有个规律0、空字符串、None、[]空列表、{}空字典这些空的东西转成布尔值都是False其他的基本都是True。这个规律以后写条件判断的时候特别有用。类型检查不确定一个变量是什么类型用type()print(type(42))# class intprint(type(3.14))# class floatprint(type(hello))# class strprint(type(True))# class boolprint(type(None))# class NoneType还有一个更实用的方法isinstance()用来判断某个变量是不是指定类型age25print(isinstance(age,int))# Trueprint(isinstance(age,str))# Falseprint(isinstance(age,float))# False这个在做参数校验的时候会经常用到。多重赋值Python 有几个比较骚的赋值方式其他语言里不一定有# 同时给多个变量赋不同的值name,age,city小明,25,北京# 同时给多个变量赋相同的值xyz0# 交换两个变量的值不用临时变量a10b20a,bb,aprint(a,b)# 20 10最后那个交换操作我第一次看到的时候觉得挺神奇的。在其他语言里你得用一个临时变量才能交换Python 一行搞定。一个综合例子写个小程序把今天的知识串起来。新建profile.py# 用户信息卡片name小明age25height1.75is_studentTruehobbiesNone# 打印信息print( 个人信息 )print(姓名name)print(年龄str(age))print(身高str(height)米)print(是否学生str(is_student))print(爱好str(hobbies))# 算一下出生年份current_year2024birth_yearcurrent_year-ageprint(大约出生于str(birth_year)年)跑一下看看效果。注意里面用了好几次str()来把数字转成字符串因为字符串和数字不能直接用拼接。解包操作符* 和 **解包就是把一个容器拆开把里面的元素一个个取出来。这个特性在 Python 里用得非常频繁。* 解包列表/元组# 把列表拆成单独的变量first,*rest[1,2,3,4,5]print(first)# 1print(rest)# [2, 3, 4, 5]# 取头尾first,*middle,last[1,2,3,4,5]print(first)# 1print(middle)# [2, 3, 4]print(last)# 5# 只取最后几个*init,last_two,last_one[1,2,3,4,5]print(init)# [1, 2, 3]print(last_two)# 4print(last_one)# 5带*的变量会吃掉剩余的所有元素组成一个列表。* 解包用于合并a[1,2,3]b[4,5,6]# 合并列表merged[*a,*b]print(merged)# [1, 2, 3, 4, 5, 6]# 在中间插入result[0,*a,99,*b]print(result)# [0, 1, 2, 3, 99, 4, 5, 6]** 解包字典config1{host:localhost,port:8080}config2{debug:True,port:9090}# 合并字典后面的覆盖前面的merged{**config1,**config2}print(merged)# {host: localhost, port: 9090, debug: True}解包用于函数调用defadd(a,b,c):returnabc nums[1,2,3]print(add(*nums))# 6把列表拆成三个参数传入kwargs{a:1,b:2,c:3}print(add(**kwargs))# 6把字典拆成关键字参数传入第 10 章讲函数的时候会更详细地讲*args和**kwargs到时候你就明白它们和解包的关系了。本章小结变量是存数据的容器命名用小写字母加下划线Python 基本数据类型int整数、float浮点数、str字符串、bool布尔值、None空值浮点数运算可能不精确这是通用问题不是 Python 的锅int()、float()、str()、bool()可以做类型转换type()查看类型isinstance()判断类型Python 支持多重赋值和一行交换变量*和**可以解包列表和字典在赋值、合并、函数调用中都很常用面试题Q1is和有什么区别点击查看答案比较的是值是否相等is比较的是身份是不是同一个对象。a[1,2,3]b[1,2,3]print(ab)# True值一样print(aisb)# False不是同一个对象简单说问的是你俩长一样吗is问的是你俩是同一个人吗。实际开发中判断是否为 None 的时候推荐用isif x is None。Q2为什么0.1 0.2不等于0.3点击查看答案这不是 Python 的 bug是几乎所有编程语言的通用问题。电脑内部用二进制表示数字而0.1和0.2在二进制下是无限循环小数存储时会有微小的精度损失。类似十进制里1/3 0.333...没法精确表示。如果需要精确的小数运算比如金融场景应该用decimal模块的Decimal类型。Q3Python 的变量是值传递还是引用传递点击查看答案严格来说 Python 是对象引用传递也有人叫传对象。变量本身存的是对象的引用类似指针而不是值本身。但对于不可变类型int、float、str、bool、tuple你修改时实际上是创建了新对象所以表现得像值传递x10yx x20print(y)# 还是 10不受影响对于可变类型list、dict、set修改会影响所有引用它的变量a[1,2,3]ba a.append(4)print(b)# [1, 2, 3, 4]b 也变了Q4bool()的结果是什么为什么点击查看答案bool()返回False。Python 有一个truthiness规则空字符串、0、None、空列表、空字典、空集合等空的值都被视为False。非空的值被视为True。这个设计很实用比如判断字符串是否为空时不用写if s 直接写if s或if not s就行。上一章 | 下一章运算符与表达式 →

相关新闻