【Python 基础 | 第一篇】数据类型、容器与流程控制:从变量到逻辑,一篇打通 Python 基本功
文章目录1. 基础数据类型Python 世界的基本元素2. 运算符让数据动起来2.1 算术运算符2.2 增强赋值运算符2.3 海象运算符2.4 逻辑运算符3. 字符串文本处理的瑞士军刀3.1 基本操作3.2 特殊字符串3.3 常用方法速查3.4 join 与 split3.5 strip 家族3.6 其他实用方法3.7 字符串格式化4. 四大容器组织数据的四把利器4.1 列表 List4.2 元组 Tuple4.3 集合 Set4.4 字典 Dict4.5 容器间的类型转换5. 流程控制让程序拥有判断力5.1 条件判断 if / elif / else5.2 三目运算符5.3 match-casePython 3.105.4 while 循环5.5 for 循环5.6 pass 语句6. 总结前言 此文是我学习 Python 过程中整理的基础知识笔记结合代码实践总结而来分享给大家。一是为了记录二是用于日后的回顾三也是希望能给其他初学者带来一点点帮助。目录基础数据类型Python 世界的基本元素运算符让数据动起来字符串文本处理的瑞士军刀四大容器组织数据的四把利器流程控制让程序拥有判断力总结1. 基础数据类型Python 世界的基本元素学习任何编程语言第一步都是认识它的数据类型。Python 的基础数据类型非常简洁一共就这几种nameLabEx# str: 字符串age10# int: 整数pi3.14159# float: 浮点数is_activeTrue# bool: 布尔值 (True/False)nothingNone# NoneType: 表示无值或空correlate23j# complex: 复数可以用type()来验证每个变量的类型print(type(name))# class strprint(type(age))# class intprint(type(pi))# class floatprint(type(is_active))# class boolprint(type(nothing))# class NoneTypeprint(type(correlate))# class complex这里有一个容易忽略的细节None不是0也不是False它是 Python 中表示什么都没有的独立类型。很多初学者会把None和False混在一起但它们语义完全不同——False是一个布尔判断结果None是值不存在。一句话总结Python 的基础数据类型不多但每一个都有明确的语义边界搞清楚它们比死记硬背更重要。2. 运算符让数据动起来2.1 算术运算符Python 的算术运算符和其他语言大同小异但有两个需要特别关注a,b10,3print(f整除:{a//b})# 3 (丢弃余数)print(f取模:{a%b})# 1 (余数)print(f幂运算:{a**b})# 1000 (10的3次方)//是整除地板除/是普通除法。这两者的区别在处理负数时尤其明显print(-7//2)# -4 (向负无穷取整)print(-7/2)# -3.5 (正常除法)2.2 增强赋值运算符所有算术运算符都可以和组合成增强赋值ab# 等价于 a a ba-b# 等价于 a a - ba*b# 等价于 a a * ba/b# 等价于 a a / ba//b# 等价于 a a // ba%b# 等价于 a a % ba**b# 等价于 a a ** b2.3 海象运算符Python 3.8 引入的:海象运算符可以在表达式内部赋值print(my_var:Hello World!)# 赋值的同时使用值它的典型场景是在while或if中同时赋值和判断减少重复计算。2.4 逻辑运算符is_adminTrueis_logged_inTrueprint(fis_admin and is_logged_in:{is_adminandis_logged_in})# Trueprint(fis_admin or is_logged_in:{is_adminoris_logged_in})# Trueprint(fnot is_admin:{notis_admin})# False# Python 特有的链式比较is_valid5a15# Trueprint(fis_valid:{is_valid})链式比较是 Python 的一个优雅特性5 a 15等价于5 a and a 15但写起来更自然。一句话总结Python 运算符不难但//、:、链式比较这几个特性值得刻意记住用好了能让代码更简洁。3. 字符串文本处理的瑞士军刀字符串是日常开发中打交道最多的类型Python 提供了极其丰富的字符串操作方法。3.1 基本操作textPython Programmingprint(text[0:6])# Python (切片: [起始:结束])print(text[::-1])# gnimmargorP nohtyP (反转字符串)print(text.upper())# PYTHON PROGRAMMING3.2 特殊字符串原始字符串r前缀将反斜杠视为字面字符print(rHello there!\nHow are you?)# \n 按字面意思打印不会换行多行字符串用三个引号包裹multiply_text Dear Alice, Eves cat has been arrested for catnapping, cat burglary, and extortion. Sincerely, Bob 3.3 常用方法速查spamhello world!print(spam.upper())# HELLO WORLD!print(spam.lower())# hello world!print(spam.title())# Hello World!print(spam.isalpha())# False (含空格和!)print(spam.isalnum())# Falseprint(spam.isdecimal())# Falseprint(spam.isspace())# Falseprint(spam.startswith(hello))# Trueprint(spam.endswith(world))# False (注意有 !)3.4 join 与 split这是一对互逆操作非常常用# join: 列表 - 字符串name[Alice,Bob,Charlie]print(.join(name))# AliceBobCharlieprint(-.join(name))# Alice-Bob-Charlieprint(,.join(name))# Alice,Bob,Charlie# split: 字符串 - 列表spamhello world!print(spam.split( ))# [hello, world!]print(My,name,is,Simon.split(,))# [My, name, is, Simon]3.5 strip 家族spam2 Hello World print(spam2.strip())# Hello World (去除两端空格)print(spam2.lstrip())# Hello World (去除左端空格)print(spam2.rstrip())# Hello World (去除右端空格)3.6 其他实用方法print(spam2.count(H))# 统计字符出现次数print(spam2.upper().count(H))# 忽略大小写统计print(spam2.replace(Hello,Hi))# 替换子串3.7 字符串格式化Python 有三种格式化方式推荐使用 f-stringnameAliceage23score95.51num1230991# f-string (Python 3.6) —— 推荐print(f{num:,})# 1,230,991 (千分位)print(f{score:.2f})# 95.51 (四舍五入)print(f{score:.2%})# 9551.00% (百分比)print(f{age:#x})# 0x17 (十六进制)# str.format() —— 推荐print(name: {}, age: {}, score: {}.format(name,age,score))# % 格式化 —— 不推荐print(name:%s%name)print(age:%d%age)f-string 不仅写法最简洁性能也是最好的。从 Python 3.6 开始没有理由不用它。一句话总结字符串方法多到记不住也没关系记住 join/split/strip/format 这四个核心操作其他的用到再查。4. 四大容器组织数据的四把利器Python 有四种内置容器类型各有特点选对容器是写好代码的第一步。容器有序可变允许重复典型场景列表 List是是是有序集合增删改查元组 Tuple是否是不可变数据函数返回多值集合 Set否是否去重集合运算字典 Dict否是键唯一键值映射配置项students[alice,bob,red,cat]# 列表names(Alice,Bob)# 元组tags{python,java,python,c}# 集合user{name:Gemini,age:1}# 字典4.1 列表 List列表是最常用的容器有序、可变、允许重复。增students[alice,bob,red,cat]students.append(alice)# 末尾追加students.insert(5,alice)# 指定位置插入删delstudents[0]# 按索引删除students.remove(bob)# 按值删除只删第一个匹配改students[0]alice22# 按索引修改查print(students)# 打印整个列表print(students[1:2])# 切片获取子列表print(students[:2])# 前两个元素print(students[1:])# 从第二个到末尾print(students[-1])# 最后一个元素print(len(students))# 列表长度print(aliceinstudents)# 成员判断print(students.count(alice))# 出现次数print(students.index(alice))# 首次出现下标遍历forstuinstudents:# 直接遍历print(stu)foriinrange(len(students)):# 按索引遍历print(students[i])拼接与 zipteachers[alice,bob,red,cat]allstudentsteachers# 列表拼接forstu,teainzip(students,teachers):# 多列表并行遍历print(stu,tea)排序scores[100,78,78,67,90]scores.sort()# 升序排序print(max(scores),min(scores),sum(scores))# 最大、最小、求和scores.reverse()# 反转scores.sort(keyNone,reverseTrue)# 降序排序4.2 元组 Tuple元组是不可变的列表一旦创建就不能增删改。tuple1(1,2,3,4,5)print(tuple1[0:2])# 支持切片print(tuple1[:2])# (1, 2)# 不支持tuple1[0] 10 → TypeError类型转换是元组的常见用法names[alice,bob,red,cat]tuple2tuple(names)# 列表 - 元组list2list(tuple2)# 元组 - 列表什么时候用元组当数据不应该被修改时比如函数返回多个值、常量配置等。元组的不可变性是一种安全约束。4.3 集合 Set集合是去重神器无序、可变、不允许重复。增删改查set1{1,2,3,3,4,1}set1.add(6)# 增set1.remove(1)# 删不存在会报 KeyErrorset1.discard(2)# 删安全缺失不报错set1.update({4,5})# 批量增print(len(set1))# 长度print(1inset1)# 成员判断removevsdiscard的区别要记住remove在元素不存在时抛出KeyErrordiscard静默跳过。实际开发中discard更安全。集合运算是集合最强大的特性set2set(abcde)set3set(defgh)print(set2-set3)# 差集a中包含而b中不包含的元素print(set2|set3)# 并集a或b中包含的所有元素print(set2set3)# 交集a和b中都包含了的元素print(set2^set3)# 对称差集不同时包含于a和b的元素4.4 字典 Dict字典是键值对键必须唯一且不可变值可以任意。增删改查stuInfo{name:zhangsan,age:23}# 增stuInfo.setdefault(city,上海)# 键不存在时才设置# 删delstuInfo[name]# 删除键值对stuInfo.pop(name)# 删除并返回值# 改stuInfo[age]24# 键存在则修改# 查print(stuInfo[name])# 按键取值print(stuInfo.keys())# 所有键print(stuInfo.values())# 所有值print(stuInfo.items())# 所有键值对print(nameinstuInfo.keys())# 键是否存在print(zhupenginstuInfo.values())# 值是否存在遍历forkeyinstuInfo.keys():# 遍历键print(key,stuInfo[key])forkey,valueinstuInfo.items():# 遍历键值对推荐print(key,value)4.5 容器间的类型转换字符串和容器之间可以互相转换str_val123123print(list(str_val))# [1, 2, 3, 1, 2, 3]print(set(str_val))# {1, 2, 3}自动去重一句话总结列表用于有序集合元组用于不可变数据集合用于去重和运算字典用于键值映射——选对容器代码就对了大半。5. 流程控制让程序拥有判断力5.1 条件判断 if / elif / elsePython 的条件判断用if、elif、else注意没有大括号靠缩进划分代码块。嵌套 ifnumint(input(input a number: ))ifnum%20:ifnum%30:print(你输入的数字可以整除 2 和 3)else:print(你输入的数字可以整除 2但不能整除 3)else:ifnum%30:print(你输入的数字可以整除 3但不能整除 2)else:print(你输入的数字不能整除 2 和 3)elif 多分支ageint(input(请输入你家狗狗的年龄: ))ifage0:print(你是在逗我吧!)elifage1:print(相当于 14 岁的人。)elifage2:print(相当于 22 岁的人。)elifage2:human22(age-2)*5print(对应人类年龄: ,human)5.2 三目运算符Python 的三目运算符写法是值1 if 条件 else 值2age10print(未成年ifage18else成年)# 未成年5.3 match-casePython 3.10Python 3.10 引入了match-case类似于其他语言的switch基本用法response_code201matchresponse_code:case200:print(OK)case201:print(Created)case404:print(404 Not Found)case500:print(Internal Server Error)|合并多个匹配值response_code502matchresponse_code:case200|201:print(OK)case300|307:print(Redirect)case500|502:print(Internal Server Error)case_:# _ 相当于 defaultprint(Unknown)_是通配符相当于其他语言switch中的default。如果不加_没有任何匹配时程序不会报错但也不会执行任何分支。5.4 while 循环count1sum0whilecount100:sumcount count1else:print(count,大于100结束)print(sum)# 5050while...else是 Python 的特色语法当循环正常结束没有被break打断时else块会执行。这个特性很多人不知道但在某些场景下很有用。5.5 for 循环经典用法——找质数forninrange(2,10):forxinrange(2,n):ifn%x0:print(n,equals,x,*,n//x)breakelse:# 这个 else 属于 for 循环不是 if# 当循环没被 break 打断时才执行print(n,is a prime number)注意这里else属于for循环不是if这是 Python 中最容易让人困惑的语法之一。for...else的含义是如果循环没有被break终止就执行else块。在这个例子中如果一个数没有被任何因子整除即没有触发break它就是质数。break 与 continueforxinrange(5,10):ifx%20:print(找到偶数: ,x)continue# 跳过本次迭代继续下一轮print(x)else:print(循环正常结束)关键字作用触发 else 吗break跳出整个循环否continue跳过本次迭代是循环最终正常结束就行5.6 pass 语句pass不执行任何操作通常用作占位符deftodo_function():pass# 以后再实现一句话总结Python 流程控制最需要注意的三个坑缩进、for...else的语义、match-case是 3.10 才有的新语法。6. 总结通过这次梳理我们把 Python 基础的三大板块串联了起来数据类型是地基搞清楚每种类型的语义边界比死记硬背更重要四大容器各有分工——列表有序可变、元组不可变、集合去重、字典键值对——选对容器代码就对了大半流程控制让程序拥有判断力for...else和match-case是两个值得特别留意的语法如果用一句话总结Python 的设计哲学是用最自然的方式表达意图——从链式比较到海象运算符从 f-string 到 for…else每个特性都在让你写出更接近人类思维方式的代码。当你不再只是记住语法规则而是理解每个特性为什么要这样设计时Python 才真正开始变成你手中的工具而不是你需要反复查阅的手册。如果我的内容对你有帮助请点赞评论收藏。创作不易你们的支持就是我坚持下去的动力