python基础学习
程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令。
虽然借助 Siri(Apple)、Google Now(Android)、Cortana(Microsoft)等技术,我们可以使用汉语直接告诉计算机做什么,比如“Siri,打开酷狗音乐”,但使用过这些系统的读者都知道,它尚未完全成熟,再加上我们语言充满了模糊和不精确因素,使得设计一个完全理解人类语言的计算机程序,仍然是一个有待解决的问题。
为了有效避开所有影响给计算机传递指令的因素,计算机科学家设计了一些符号,这些符号各有其含义,且之间无二义性,通常称它们为编程语言。编程语言中的每个结构,都有固定的使用格式(称为语法)以及精确的含义(称为语义)。换句话说,编程语言指定了成套的规则,用来编写计算机可以理解的指令。习惯上,我们将这一条条指令称为计算机代码,而用编程语言来编写算法的过程称为编码。
这样说编程语言可能有点抽象,其实编程语言,是一种能让人类与计算机进行沟通交流的语音工具,人类通过写代码的方式控制计算机完成自己想要的操作
- 输入输出语句 IO
# print --> 输出语句,内置函数,能让计算机输出一句话 print("你好,python") # input --> 输入语句,内置函数,能让计算机接受你从键盘输入的一段话 # input(提示语) input("请输入你的姓名")
-
变量:
可以用来存储数据的容器——存储一/多个值的数据容器
变量命名规范:
1.由数字,字母,下划线组成
2.不能数字开头/不能用特殊符号
3.大小写分明 Name name
4.见名知意,尽量简单粗暴 --> 驼峰命名法/匈牙利命名法
5.不能取关键字以及不要取内置函数名
-
数据类型:
主要有数值类型,序列类型和散列类型
-
数值类型:
int 整型/整数 0,1,2,520,1314,-10086
float 浮点型/小数 6.66 5.20 -13.14
bool 布尔类型 True False 布尔类型一般用来做条件判断.判断一个东西为真/假 True为真,也可以表示数值1 False为假,也表示数值0
-
序列类型:
str 字符串 用引号包裹起来的数据,可以用单/双/三引号来保存数据.但是不能混用.
name = "博客园"
list 列表 用中括号包起来的数据,可以存放多个,多种不同类型的数据.并且里面的值可以修改
names = ["张三","李四","王五","赵六"]
tuple 元组 用小括号包起来的数据,可以存放多个,多种不同类型的数据.里面的值不可修改
names = ("张三","李四","王五","赵六")
如果要存储多个数据,并且会修改那就用列表来保存,如果不希望被修改就用元组来保存
有个字符串 name = "钱七张三"
序列类型的特性:
1.下标:
下标就是坐标的意思,类似于酒店的门牌号,让我们的数据有位置的概念,我们可以通过对应的下标访问到找到对应的数据
下标的值是从0开始计算的: 0 1 2 3 4
下标也支持负向取值 -1 -2 -3 -4. -1就是最后一位 -2就是倒数第二位
2.索引
通过下标来获取指定的数据
序列名[下标]
name='张三李四王五'
# 0 1 2 3 4 5
print(name[1]) #取出三字
3.切片
把多个数据拆分取出来.有两个值 1.起点值 2.终点值
有个特性:取头不取尾,终点值实际上是到前一位,比如终点值写的是5,实际上是取到下标位置为4的数据
name = "王五张三"
print(name[1:4]) # 输出五张三
print(name[:2]) # 输出王五
如果起点值/终点值空着不写,默认是全部取
name = "王五张三"
print(name[:4]) # 输出王五张三
print(name[1:]) # 输出五张三
print(name[:]) # 输出王五张三
4.步长
正常取值都是一个个的取出来,步长就可以设置一次性跨几个值
num = "123456789"
#序列名[起点:终点:步长]
print(num[::2]) # 一次跨2位取数据.输出结果为13579
print(num[::-1]) # 步长设置为-1.就可以倒过来输出序列类型数据,结果为987654321
-
散列类型:
set 集合 用大括号包裹起来的数据,里面的数据 1.不会重复 2.可以进行逻辑判断
set1 = {1,1,1,2,3,4,6,7,8,10,13}
print(set1)
#输出{1, 2, 3, 4, 6, 7, 8, 10, 13}
重复的数据是不会被保存的.最后输出的时候都是唯一的数据
1.去重,不会存重复数据
2.逻辑判断(交并差集)
dict 字典 用大括号包裹起来的数据,里面的数据是以键值对的方式来存储
键值对 key:value 键:值 键值对的概念就是两者之间存在解释/映射关系
键值对之间用,逗号隔开
kylin = {"姓名":"张三","身高":177.5,"是否男性":True }
#字典里取值是通过键名.比如要输出"张三"
print(kylin["姓名"])
方法:
python内置的一些功能函数.能够实现各种功能,比较常见的就是增删改查.
让我们可以对数据更好的实现操作
格式化输出:
为了帮助我们更好的输出一些带有变量的数据,或者特定格式数据的输出方式.
f-str --> 在字符串前加f,把要输出的变量用{}包起来
name = "张三"
age = 18
print(F"大家好,我叫{name},我今年{age+6}岁")
#输出结果为,大家好,我叫张三,我今年24岁
%占位符 --> 在字符串用占位符先占个位置,后续再用实际的值来代替
name = "张三"
age = 18
print ("你好,我叫%s,我今年%d岁"%(name,age))
# 输出结果为 你好,我叫张三,我今年18岁
%s 字符串
%d 整型
%f浮点型(默认小数点6位)
%.2f 输出浮点值,小数点到后两位
format --> 在字符串中用{}先占个位置,后续再用实际的值来代替
name = "张三"
age = 18
print ("你好,我叫{},我今年{}岁".format(name,age))
# 输出结果为 你好,我叫张三,我今年18岁
转义字符:
带有特定功能的字符,表现形式为\后面加上指定的字符
\n --> 换行
\t --> 制表符,四个空格
\\ --> 正常输出一个\
\a --> 系统提示音
\' --> 正常输出一个引号
取消转义 --> 在包含了转义字符的字符串前,加个r --> 原始字符串
print(r"asdasd \n asuyd \t asduyasd")
print("asdasd \n asuyd \t asduyasd")
#第一行代码输出结果为 asdasd \n asuyd \t asduyasd
"""第二行代码输出结果为:
asdasd
asuyd asduyasd"""
-
流程控制语句:
1. if 语句
选择执行/分支语句 --> if --> 判断语句,如果条件满足,就执行对应的代码
python的代码块,代码区域,地盘的地盘是通过缩进来表示的.
单分支:如果满足条件就执行代码,不满足就没事发生
if 判断条件:
代码块
if 成绩>90:
print("好厉害")
2.if....else语句
双分支:如果满足条件就执行if里的代码块,不满足就执行else代码块
if 判断条件:
代码块
else:
代码块
tq=input("请输入天气:")
if tq=='下雨':
print("带伞")
else:
print("不带伞")
3.if....elif....else语句
多分支: 如果满足条件就执行if里的代码块,不满足继续往下判断是否满足elif的条件.都不满足就执行else代码
if 判断条件:
代码块
elif 判断条件:
代码块
else:
代码块
成绩 = int(input('请输入你的成绩:'))
if 成绩 > 90:
print("自助餐")
elif 成绩 > 70:
print("KFC")
else:
print("加油,努力.")
if 如果 elif 或者 else 否则
运算符:
and: 条件都满足时,才为真,才执行
语文"和"数学都90分以上 --> 带你下馆子
or: 条件满足其中一个,就为真,就执行
语文"或"数学90分以上 --> 带你下馆子
in : 成员运算符,判断该数据在不在另外一个数据集合/容器里,得到结果为布尔类型
li = [1,2,3,4,5] 1 in li
结果为True.因为li里面有1
not/!: 杠精,取反.什么都和你反着来,你对了它就给你弄错,你错了它反而给你弄对
语文成绩 = int(input('请输入你的语文成绩:'))
数学成绩 = int(input('请输入你的数学成绩:'))
if 语文成绩 >90 and 数学成绩> 90:
print("带你下馆子")
elif 语文成绩 >90 or 数学成绩> 90:
print("带你吃街边摊")
else:
print("加油,努力.")
循环执行: while/for 重复执行代码,条件为真(True)就一直执行,为假(False)就结束循环
wile循环
while 循环条件:
代码块
抄书 = 0
while 抄书 <= 100:
print(抄书)
抄书 += 1 # 相当于 抄书 = 抄书+1
用while一定要注意细节,注意更新循环条件
for循环
作用和while其实类似,但是for在知道循环次数,或者进行数据遍历的时候会更方便
1.for 变量 in 可迭代对象
2.for 变量 in range(起点,终点)
3.for 变量 in range(起点,终点,步长)
li = [1,2,7,5,1,True]
for i in li:
print(i)
for i in range(20):
print(i)
for i in range(0,101,2):
print(i)
break --> 结束本次循环
continue --> 跳过本次循环
for i in range(100):
if i == 10:
continue
print(i)
if i == 70:
print("over")
break
-
函数基础:
函数的作用: 把一堆代码包裹起来,用使用的时候直接调用该函数即可
类似于生活中的单点菜与拿套餐
函数的使用分为两步:
1.定义 def
2.调用 函数名()
定义函数:
def 函数名():
代码块
def 函数名():
pass # 空函数,避免报错
调用函数:
函数名() # 直接调用函数,运行里面的代码
print(函数名()) # 调用函数,并输出里面的返回值
带参函数:
形参: 走个形式,先占个位置 --> 类似于占位符,现实中的车票
实参: 实际使用,在运行的时候会取代形参
定义带参函数:
def 函数名(参数1,参数2):
代码块
# 必备参数,有几个形参就得有几个实参
def add(a,b):
print(a+b)
add(35,70) #输出105
# 默认参数,在定义形参时,就已经给参数赋值了.但值可以被覆盖,定义好的参数要写在右边
def talk(age,name="张三"):
print(f"我叫{name},我今年{age}岁")
talk(18)
# 输出我叫张三,我今年18岁
# 不定长参数1:可以接受多个参数.传输过来的数据以元组的形式来接受.特征为形参名前有1个* 一般形参叫 *args
def fun(*args):
print(args)
fun(True, 666, "天气好", "注意防晒")
#输出(True, 666, '天气好', '注意防晒')
# 不定长参数2:可以接受多个参数.传输过来的数据以字典的形式来接受.特征为形参名前有2个* 一般形参叫 **kwargs
def fun(**kwargs):
print(kwargs)
fun(name="张三")
#输出{'name': '张三'}
返回值:return
可以这么理解,函数里面的代码块,是过程,返回值是结果
有的时候我们只需要了解知道代码块过程.那就正常调用这个函数
当需要结果的时候,就可以print输出或者用变量 = 函数名()的方式来赋值
def 函数名():
return 返回值
def add(a,b):
return a+b
sum1 = add(666,520)
print(sum1)
#输出结果为1186
如果返回值未定义,默认为None 为空
-
函数进阶:
函数对象: 把函数当成一个单纯的数据来使用
1.用函数来赋值: (1).把函数赋值给一个变量 (2).把函数的返回值赋给变量
2.可以用函数作为返回值
3.函数可以作为参数放到字典,列表,元组,集合里
4.函数可以作为参数,传入给别的函数
名称空间/作用域:
作用域: 一个数据,能够使用的范围
全局作用域: 整个程序里都可以使用
局部作用域: 在程序中的部分位置才能使用(在特定函数里)
名称空间:
存放存储程序中所有名字的地方: 变量名/函数名
内建名称空间: 存放python内置的函数,模块, 会随着python程序运行而产生,print,input,type
全局名称空间: 存储自己定义的外层变量名,函数名, 也是会随着python程序运行而产生
局部名称空间: 存储自己在函数内定义的变量名,函数名,形参. 会随着函数的调用而产生
global --> 提权,把局部内的变量,变成一个全局变量
nonlocal --> 降权,把变量进一步的私有化
函数总结:
把一些常用的代码封装包装起来,方便后续的使用.是核心灵魂知识点!!!
闭包:
闭: 封闭,嵌套函数的内层函数
包: 作用域
闭包: 在一个嵌套函数中,用内层函数来操作数据,得到结果,外层函数来返回.
优点:间接修改/操作数据.保障代码的稳定性安全性
def fun(a,b):
def add():
return a+b
return add
def 老板(需求1,需求2):
def 员工():
干活
return 员工
万恶的老板负责揽活, 卑微的员工负责干活. 真正做事的是员工/内层函数
得到结果的是外层函数/老板
装饰器: 间接添加功能
在不修改源代码,调用方式的前提下,给函数添加一些特定的功能
实现原理就是通过闭包. 把要添加功能的函数传递进来.在内层函数调用,并在内层函数写上对应增加的功能. 最后把内层返回返回出去
迭代器 iter:
用来对一串数据进行更新迭代的操作
白话版: 把很多的数据,一个接一个/有顺序的输出出来
for循环的实现就是基于迭代器.把一个有很多数据的对象.转换成迭代器
然后把里面的数据按照指定的规则输出
生成器 yield:
一个函数里有yield就是生成器
生成器的本质就是一个迭代器的变体.用来帮助我们生成一个自定义的迭代器.
自己指定规则,生成指定的数据,而不用自己手动的一个个声明变量.
生成器常用语生成器表达式来进行实现
模块与包:
模块指的就是一个python文件. 它的文件名就是它的模块名
kylin.py 它的模块名为kylin 不带.py
可以把一些常用的功能,写到一个模块里,在需要的时候导入即可灵活使用
导入模块 --> import 导入
ipmort 模块名
ipmort win32gui
ipmort time
当你导入模块后程序会自动的做三件事:
1.运行该模块里的所有代码,确保没有异常
2.生成一个名称空间,该名称空间与模块名同名
3.在当前的运行的程序中,连接刚刚生成的名称空间.后续就可以通过模块名.的方式来操作模块的数据
模块名.变量名
模块名.函数名
模块分为三种:
1.内置模块 --> python自带的功能模块,不需要另外下载
2.第三方模块 --> 他人写好上传的模块. 使用之前需要通过pip下载
3.自定义模块 --> 自己写的python模块
下载模块: 在cmd中输入
pip install 模块名
pip install pygame
别名操作:
当一个模块名过长或不好记的时候,可以用as关键字取别名
import 模块名 as 别名
import win32gui as gui
包:
包属于模块的一种变体,表现形式为一个文件夹里有个名为__init__的文件.
作用就是更好的帮助我们统一管理一些功能相同的代码
并且当导入包内的模块时,__init__.py里的代码会自动执行
所以可以在__init__里面写上一些关于这个包/里面模块的一些说明,或属性配置
main:
python有一个自带的方法叫__name__.作用就是可以判断文件所处的状态
当文件是以程序的身份执行时,__name__的值为__main__
当文件是以模块的身份执行时,__name__的值为模块名
所以可以写一个if判断,把一些杂七杂八的代码放到if里.当这个文件是作为程序运行时才会出现
if __name__ == '__main__':
pass
字符编码:
计算机最底层的字典. 类似于人类的学员名册,每个人都有对应的学号.计算机同样.每个字符在底层都有对应的序号
1.目前世界上最主流的字符编码为 utf-8
2.一个程序/文件是用什么编码写的.最好就是用对应的编码去读取.否则可能会乱码
文件操作:
三要素: 1.打开文件 2.操作文件 3.关闭文件
为了规避忘记关闭文件所导致的资源损耗,更推荐用with open来写
with open('文件路径+文件名','操作方式',encoding = '字符集') as f:
with open("别睡觉.txt",'w',encoding='utf-8') as f:
f.write("别睡觉")
操作方式:
w = write写入
r = read读取
a = append追加
b = byte字节码
t = text文本
常用模块:
time: 时间模块
random: 随机模块
os 操作系统模块
sys 系统模块
json 序列化文件模块
hashlib 哈希模块,是一种算法,可以生成一个加密值!!!
1. if 语句
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」