python笔记
python基础
来源:b站 up“林粒粒呀” 《一口气入门Python》
1. 列表
shopping_list = ["键盘", "鼠标"]
# 使用append()方法
shopping_list.append("显示器")
# 使用remove()方法(需要删除的元素必须在列表中)
shopping_list.remove("鼠标")
# 列表的索引(从0开始)
print(shopping_list[0])
tips:方法和函数的(使用)区别:
# 创建一个列表
shopping_list = []
shopping_list.append("键盘")
shopping_list.append("鼠标")
shopping_list.append("蓝牙耳机")
print(shopping_list)
# 输出:['键盘', '鼠标', '蓝牙耳机']
print(len(shopping_list))
# 输出:3
# 使用索引对列表直接修改
shopping_list[0] = "机械键盘"
print(shopping_list)
# 输出:['机械键盘', '鼠标', '蓝牙耳机']
shopping_list.remove("鼠标")
print(shopping_list)
# 输出:['机械键盘', '蓝牙耳机']
price = [100, 200, 800, 50, 20]
min_price = min(price)
max_price = max(price)
# sorted()是一个函数,用‘函数名(对象名)’的方式调用,有返回值
sorted_price = sorted(price)
print(min_price)
print(max_price)
print(sorted_price)
# sort()是一个方法,用对象名.方法名的方式调用,没有返回值
# sort()列表进行就地排序操作,这意味着它会改变原始的price列表,并且返回值为None。
sort_price = price.sort()
print(type(sort_price))
print(price)
'''
输出:
20
800
[20, 50, 100, 200, 800]
<class 'NoneType'>
[20, 50, 100, 200, 800]
'''
2. 字典和元组
字典, 键和值用引号表示对应(key:value)
字典的元素(键值对)用逗号分隔开。
tips,key必须是不可变的,所以列表不能作为key
- 当要获取某个键的值,就用字典名[键名]获取。
- 元组:用圆括号表示,但元组是不可变的,所以可以作为字典的键(key)。
tips,字典和列表一样,是可变的。
- 往字典里添加新元素:直接“字典名[键名] = value” 完成赋值即可。
contacts["美女A"] = 13098754567
- 查询某个键是否存在:key in '字典名' (这个结果是一个bool变量)
- 删除:del 字典名[键名]
- 查询字典长度:用len()函数,len(字典名)即可返回字典长度。
- 字典里有三个方法:字典名.keys()、字典名.values()、字典名.items()
3. for循环
for 变量名 in 可迭代对象:
# 对每个变量做一些事情
例1:找出发烧的员工(结合字典和for循环)
temperature_dict = {"111": 36.2, "112": 36.9, "113": 37.8, "114": 38.2, "115": 37.9}
for staff_id, temperature in temperature_dict.items():
if temperature >= 37.3:
print(staff_id)
'''
输出:
113
114
115
'''
例2:高斯数学题——1加到100的和是多少?
# for循环的用法:高斯数学题——从1加到100的和是多少?
total = 0
for i in range(1, 101):
total += i
print(total)
# 输出:5050
4. while循环
假设我们想要记录日落的全过程,想写一个自动化程序判断是否继续拍照(如果天空亮度小于500就停止拍照,否则就一直拍照
- 方法1:定义一个函数,用一个if判断。
存在问题:只会拍1次照,显然没办法记录下日落的全程
- 方法2:定义一个函数,用一个for循环。
存在问题:只会拍有限次数,计算机速度很快,仍旧没办法保证(拍下足够数量的照片)记录下日落的全程
- 方法3:使用while循环(nice!)
tips:该例说明,在条件何时结束未知的情况下,while比for更适合使用。
不过,在很多情况下,while和for可以互相替换使用(可转换)。
如图所示:
tips,在既可以用for也可以用while的情况下,for循环看上去更简洁也更安全(如果在while里面忘了写i = i + 1 这条,可能会进入无限循环)
总结:for循环在有明确循环对象或次数的时候用,while循环则更通用,特别是在不知道循环次数的情况下。
5. 格式化字符串
-
方法1:format方法
根据位置指定替换的内容
根据关键词指定替换的内容
-
方法2:在字符串前面加f,之后的字符串会被替换为变量指定的内容
-
除了用字符串进行格式化,数字也可以对字符串进行格式化。
例:打印gpa成绩(虽然gpa是浮点数,但用format方法时不需要手动转化为字符串,就可以打印出绩点信息。在{}中用:.2f指定了打印浮点数时保留2位小数)
# gpa字典
gpa_dict = {"小明": 3.251, "小花": 3.869, "小李": 2.683, "小张": 3.685}
# format方法
for name, gpa in gpa_dict.items():
print("{0}你好,你的当前绩点为:{1: .2f}".format(name, gpa))
'''输出:
小明你好,你的当前绩点为: 3.25
小花你好,你的当前绩点为: 3.87
小李你好,你的当前绩点为: 2.68
小张你好,你的当前绩点为: 3.69
'''
# -f方法
for name, gpa in gpa_dict.items():
print(f"{name}你好,你的当前绩点为:{gpa: .2f}")
'''输出:
小明你好,你的当前绩点为: 3.25
小花你好,你的当前绩点为: 3.87
小李你好,你的当前绩点为: 2.68
小张你好,你的当前绩点为: 3.69
'''
6. 函数
例:写一个计算用户BMI的函数,并在函数中输出一句胡“您的BMI类型为:xx”
# BMI = 体重 / (身高 ** 2)
# 写一个计算BMI的函数
# def calculate_BMI():
# user_weight = float(input("请输入您的体重(单位 : kg)"))
# user_height = float(input("请输入您的身高(单位 : m)"))
#
# user_BMI = user_weight / (user_height ** 2)
# print("您的BMI是:" + str(user_BMI))
# if user_BMI <= 18.5:
# print("您的BMI分类为:偏瘦。")
# elif 18.5 < user_BMI <= 25:
# print("您的BMI分类为:正常。")
# elif 25 < user_BMI <= 30:
# print("您的BMI分类为:偏胖。")
# else:
# print("您的BMI分类为:肥胖。")
#
# calculate_BMI()
def calculate_BMI(weight, height):
BMI = weight / (height ** 2)
if BMI <= 18.5:
category = "偏瘦"
elif BMI <= 25:
category = "正常"
elif BMI <= 30:
category = "偏胖"
else:
BMI = "肥胖"
print(f"您的BMI分类为:{category}")
return BMI
result = calculate_BMI(55,1.6)
print(result)
(明显我写的版本不够优雅/(ㄒoㄒ)/~~)
7. 模块
“不要重复造轮子”,python内置函数如果可以解决我们的问题,直接调用。
但是如果python内置函数不够用,可以把目光投向Python模块。
模块就是一个Python程序,引入模块后,里面的函数和变量都可以为我们所用。
比如:计算中位数,可以自己写一个函数,也可以引入statistics模块后直接调用里面的medium()函数,明显后者更加简洁和优雅。
为什么sum()是python的内置函数可以直接用,而medium却要引入模块后才能从模块中调用呢?
答: 这就好像常用的家具直接摆在家里,不常用的家具放在仓库,等有需要时再拿出来用。
tips, sum函数的用法,如下所示
>>>sum([0,1,2])
3
>>> sum((2, 3, 4), 1) # 元组计算总和后再加 1
10
>>> sum([0,1,2,3,4], 2) # 列表计算总和后再加 2
12
- 引入模块的方法,如下三种:
第一种:使用import语句,之后需要使用模块里面的函数或变量时,用模块名.函数名即可。
第二种:使用from...import...语句(这里直接指明自己要import什么函数、什么变量),之后要使用模块里面的函数或变量,直接使用即可,前面不需要加模块名。
第三种:使用from...import * 语句,这里直接引入了所有的函数和变量,不推荐。因为可能会出现引入的两个模块中有名字相同的函数或变量冲突的情况。
使用第一种import方法和使用第二种from...import...方法,都可以很好地避免冲突。
引入第三方库,需要安装。
8. 对象和类
-
面向对象编程,先考虑各个对象有什么性质,可以做什么事情,而不是向面向过程编程那样直接来考虑要完成的事情的流程。
举例:
-
如图所示,可以看出来这样在存钱和取钱函数中,本来需要传入的一堆参数被两个对象代替了,减少了参数的数量。
(如果不用类和对象,函数的参数过多、过于散落,没办法区分编号是纸币的编号还是ATM机的编号,不利于我们理解参数的具体含义。) -
用对象把相关属性绑定在一起,还有利于让程序逻辑更加清晰。(可以直接通过对象获取与对象绑定的属性)。这会让程序的逻辑和数据的后续流动更加清晰。
所谓方法,就是放在类里的函数; 所谓属性,就是放在类里的变量。
面向对象编程,先把事务分解到各个对象身上,描述各个对象的作用,然后才是它们之间的交互。(面向过程是编年体,面向对象是纪传体)
- 而且,对象不仅可以把所有相关属性和方法绑定在一起,结合方法和属性,还能够更优雅地处理复杂逻辑。
在逻辑或信息复杂的时候,面向对象编程可以让逻辑更清晰、信息更集中。
- 面向对象编程还有三个反复被提及的特性:封装、继承、多态。
- 下面这个例子,展示了多态的作用。
面向对象编程的多态,让我们可以无需判断学生的类型(再去执行不同的函数),而是可以统一调用同一名称的方法(由于对象不同,自动会执行不同的方法)。
- 总结:面向对象未必完全优于面向过程(否则面向过程编程就不会成为另一个主流)。选择哪种编程实践,取决于具体场景、具体需求。
tips:C是纯面向过程语言,Java是纯面向对象语言。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~