课程链接:
【黑马程序员python教程,8天python从入门到精通,学python看这套就够了】 https://www.bilibili.com/video/BV1qW4y1a7fU/?p=67&share_source=copy_web&vd_source=7fc4c2ee09393d71ca17ab57a1cdba09
for循环
基础知识点
1.其中的临时变量作用域先定为:循环内
2.for循环的嵌套
# 坚持送2朵花,一共送3天
for i in range(1, 4):
print(f"今天是第{i}天")
for j in range(1, 3):
print(f"第{j}朵玫瑰花")
print(f"第{i}天结束")
i = 1
j = 1
for i in range(1, 4):
print("今天是第{}天".format(i))
for j in range(1, 3):
print("第{}朵玫瑰花".format(j))
print("第{}天结束".format(i))
# format的两种用法:
# 第一种要在字符串前面加f,字符串内指明要格式化的值
# 第二种要在字符串后面加format,在format中指明格式化的值,但是字符串中只需要用大括号标明位置。
用while循环写这个代码段:
i = 1
while i <= 3:
print("今天是第{}天".format(i))
j = 1
while j <= 2:
print("第{}朵玫瑰花".format(j))
j += 1
i += 1
实例:制作九九乘法表
for i in range(1, 10):
for j in range(1, i+1):
num = j * i
print(f'{j}*{i}={num}\t', end='') # \t是水平制表符end=""是避免换行
# 也可以
# print(f'{j} * {i} = { j * i }\t', end='')
print() # 外层循环可以通过print输出一个回车符,从而实现换行
ps.水平制表符
break和continue
实战:发工资
# 自写版
import random
a = 10000
for i in range(1, 21):
num = random.randint(1, 10) #每一次循环形成一个新的随机数
if num >= 5:
if a > 0:
a = a - 1000
print(f"向员工{i}发放工资1000元,绩效分{num},账户余额此时剩余{a}元")
else:
print("工资发完了,下个月再领取")
break ##终止循环
else:
print(f"员工{i},绩效分{num},不发工资,下一位")
# 标准版
money = 10000
for i in range(1, 21):
import random
score = random.randint(1, 10)
if score < 5:
print(f"员工{i},绩效分{score},不发工资,下一位")
continue # 跳过发放
if money >= 1000:
money -= 1000
print(f"向员工{i}发放工资1000元,绩效分{score},账户余额此时剩余{money}元")
else:
print("工资发完了,下个月再领取")
break
注意continue的用法,和a -= 1000
函数
语法
def 函数名(参数)
函数段
return
tip:在自定义函数时,参数和返回值不需要都可以省略
函数中的none值
在if判断中,none等同于false
一般用于在函数中主动返回none,配合if做相关处理
def check_age(age):
if age > 18:
return "success"
else:
return None
result = check_age(19)
if not result: # 判断result是真值还是假
print("未成年")
if result:
print("成年")
函数说明文档(文档字符串)
函数作用域
在函数内部定义的变量不能在全局范围使用,但在函数外部的变量可以在函数内部使用
global关键字
想要在函数内部修改全局变量:
num = 100
def change_num():
global num
num = pow(num, 2)
print(num)
change_num()
ATM实例:
money = 5000000
ask_name = input("what's your name?\n")
print(ask_name)
def check_balance(show_header): # 重点,运用真值假值来判断第一行check balance标题是否需要输出。如果调用函数时形参为True,输出;形参为None,不输出
global money
if show_header:
print("---------------check balance-----------------")
print(f"hi,{ask_name},your balance is {money}.")
def deposit_money():
global money
check_balance(None)
deposit = int(input("input your deposit account:"))
money += deposit
print(f"hi,{ask_name},your taking out of {deposit} is successful\n"
f"your balance is {money}.")
def take_out_money():
global money
check_balance(None)
takeout = int(input("input your takeout account:"))
if takeout < money:
money -= takeout
print(f"hi,{ask_name},your taking out of {takeout} is successful\n"
f"your balance is {money}.")
else:
print("the balance is less than the taking out account, please input again.")
def main_manu():
sentence_a = input(f"--------main manu------------\n"
f"hi,{ask_name},welcome to the ATM,please choose:\n"
f"check balance\t\t\t(input 1)\n"
f"deposit_money\t\t\t(input 2)\n"
f"take_out_money\t\t\t(input 3)\n"
f"login out\t\t\t\t(input 4)\n"
f"-----------------------------\n")
return sentence_a # 将输入的值返回到全局中
while True:
keyboard_input = main_manu() # 调用Main_manu函数,并将返回的函数值main()赋给一个新变量,用sentence_a没用,因为好像局部变量没法在全局调用
if keyboard_input == "1": # input函数强制返回字符串类型,所以必须用==和双引号
check_balance(True)
continue # 用continue返回循环
elif keyboard_input == "2":
deposit_money()
continue
elif keyboard_input == "3":
take_out_money()
continue
else:
print("you have login out.")
break
数据容器
列表[] list
列表中存储的数据类型可以是不同的,布尔值、数值、字符串都可以
列表嵌套和索引
my_list = [[1, 2, 3], [4, 5, 6]]
print(my_list[0][0]) # 取my_list列表中的第一个列表的第一位
列表方法
方法和函数的区别:
# 修改列表内的元素
my_list[0] = "修改值"
# 插入值
my_list.insert(1, "插入值")
# 在列表末尾追加值
my_list.append("追加值")
# 追加多个值,输出:['修改值', '插入值', [4, 5, 6], '追加值', 7, 8, 9]
my_list2 = [7, 8, 9]
my_list.extend(my_list2)
print(my_list)
my_list = [1, 2, 3, 4, 5, 6]
# 删除值的两种方法
del my_list[2]
my_list.pop(2)
print(my_list)
my_list = [1, 2, 3, 4, 5, 6, 1]
# 从前向后寻找并且删除第一个元素
my_list.remove(1)
# 统计列表中某元素数量
print(my_list.count(1))
# 统计全部元素数量
print(len(my_list))
ps. index查找元素索引
mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(mylist.index(1))
另一种方法:enumerate函数查找元素索引值
programming_languages = ["JavaScript","Python","Java","Python","C++","Python"]
python_indices = [index for (index, item) in enumerate(programming_languages) if item == "Python"]
print(python_indices)
#[1, 3, 5]
补充:索引值的应用
列表使用中的循环(p67)
mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_list = []
for element in mylist:
if element % 2 == 0:
new_list.append(element)
print(new_list)
mylist = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
new_list = []
index = 0
while index < len(mylist):
a = mylist[index]
if mylist[index] % 2 == 0:
new_list.append(a)
index += 1
print(new_list)
元组() tuple
元组的元素类型不受限
如果要写单个元素的元组,一定要在后面加括号
my_turple = (1,)
print(type(my_turple))
元组的相关操作
元组与列表的不同
元组与列表有两个不同点。
第一个不同点是元组的声明使用小括号,而列表使用方括号,当声明只有一个元素的元组时,需要在这个元素的后面添加英文逗号;
第二个不同点是元组声明和赋值后,不能像列表一样添加(append)、删除(del)和修改元素,也就是说元组在程序运行过程中不能被修改。
用于列表的排序、替换、添加等方法也不适用于元组,适用于元组的主要运算有元组的合并、遍历、求元组的最大值和最小值等操作方法。
元组中的字符串、int数字、或者有集合时,他们本身是不可被修改的,所有不支持对他们做改变,但是列表和字典本身是可修改的,所以我们能对元组中的列表和字典做操作。
字符串 string
字符串是无法修改的。
字符串操作
split是将字符串从以函数参数给出的字符串参数为分界线,分割成多个列表元素,最后输出一个新的列表
字符串和列表的相互转换
# 字符串转列表
# 1
str1 = "hello python"
list1 = str1.split(" ")
print(list1)
# 2
list2 = list(str1)
print(list2)
# 列表转字符串
result = "".join(list2) # 注意函数顺序
序列切片
result = my_list[起始,结束,步长]
只要没放起始,没放结束,就是从头取到尾;有结尾的时候不取结尾
序列切片实例
# 切片+倒叙
str1 = ( "万过薪月,员序程马黑来,nohtyP学" )
result1 = str1[::-1][9:14]
print(result1)
result2 = str1[5:10][::-1] # 取数可以取到写出来的结尾。切片不能切到写出来的结尾
print(result2)
# 分割+取数+倒序
result3 = str1.split(",")[1].replace("来", "")[::-1]
print(result3)
集合{} set
为什么要使用集合
列表可修改、支持重复元素且有序
元组、字符串不可修改,支持重复元素且有序
他们都可重复,而集合可以对内容进行去重处理
集合的基本操作
my_set = {1, 2, 3, 40, "remove1"}
# 添加元素
my_set.add("add1")
print(my_set)
# 移除元素
try2 = my_set.remove("remove1")
print(my_set)
# 随机取出一个元素
element = my_set.pop()
print(f"随即取出一个元素为{element},,此时集合为:{my_set}")
# 取两个集合的差集
set1 = {1, 2}
set2 = {2, 3}
set3 = set1.difference(set2)
print(set3)
# 删除集合1中和集合2相同的值
set1 = {1, 2}
set2 = {2, 3}
set1.difference_update(set2)
print(set1)
# 合并集合
set1 = {1, 2}
set2 = {2, 3}
set3 = set1.union(set2)
print(set3)
集合遍历
集合没有下标索引,所以不能进行while循环,但可以进行for循环
字典{}
pythonz中的字典有序,按照输入顺序,但是其本身没有下标索引
字典的特点
字典的基本操作
字典的更新与赋值
数据容器的分类
数据容器的通用转换
数据容器中的元素排序
# 正向排序
sorted(my_xulie)
# 反向排序
sorted(my_xulie ,reverse = True)
函数中的参数
函数的逻辑传递(函数作为参数)
通过将函数作为参数,传入计算逻辑
Lambda匿名函数
定义无名称的匿名函数,只能临时使用一次
lambda 传入参数:函数体(一行代码)
python的文件操作
1.文件的读取和写入
w和a模式中,文件不存在都会创建新文件:如果文件存在,w会清空原有内容,a会追加在原有内容之后
异常、模块与包
捕获异常
# 捕获所有异常
try:
f = open("D:/abc.txt", "r", encoding="UTF-8")
except:
print("出现异常,因为文件不存在,我将改用w模式")
f = open("D:/abc.txt", "w", encoding="UTF-8")
else: # 如果没异常就执行
finally: # 无论有没有出现异常都要执行
# 捕获指定异常
try:
print(name)
except (NameError, xxx, xxx) as e:
print("出现了变量未定义的异常")
异常的传递性
捕获异常时,不需要回溯到顶端错误的那处代码,在函数调用的最末端try catch也是可以的
Python模块
__main__变量
避免导入时输出模块里的输出值
def test(a, b):
print(a + b)
if __name__ == '__main__':
test(1, 2)
__all__变量
只调用模块里的某些自定义函数
在这个例子中,如果有文件用import *调用该模块,只能使用testa;但如果手动导入import testb,则可以使用
__all__ = ['testa']
def testa(a, b):
print(a + b)
def testb(a, b):
print(a - b)
Python包
__init__.py文件
创建包会默认自动创建的文件,通过这个文件来表示一个文件夹是python的包
__all__变量的作用
在init文件中输入,从而控制import *能够导入的内容
安装第三方包
pip install + 包名
python数据可视化
json数据到python数据转化
# 将字典转换为json字符串
d = {"name":"zhoujielun"}
json_str = json.dumps(d, ensure_ascii = False)
# 将json字符串转换为python数据类型
a = '[{"name":"zhoujielun","age":11}]'
py_str = json.loads(a)
简单绘图
全局配置选项
Line.set_global_opts()
from pyecharts.charts import Line
line = Line()
line.add_xaxis(["china", "america", "uk"])
line.add_yaxis("gdp", [30,10,20])
line.render()
对象和类
初识对象
# 演示对象
class Student:
name = None
age = None
nationality = None
stu1 = Student()
stu1.name = "kathy"
stu1.nationality = "china"
stu1.age = 18
print(stu1.name + "%.f"%stu1.age + stu1.nationality)
注意整数和字符串的转换,无法同时输出字符串和整数
类的成员方法
类由两部分组成:
类的属性:成员变量
类的行为:成员方法(定义在类内部的函数称为方法)
self在传参时不需要理会,但是在方法内部,想要访问类的成员变量,必须用到self
class Student:
name = None
def sayhi(self,msg):
print(f"大家好,我是{self.name},{msg}")
stu1 = Student()
stu1.name = "周杰伦"
stu1.sayhi("哎呦不错哦") # 不需要再打印一次,因为执行函数时已经打印了
tips.
cmd中退出python:quit() 或者 ctrl + z