一、Pycharm快捷键
给字体增大/减小添加“Ctrl+鼠标滚动”快捷键
Ctrl+d:复制并粘贴所选代码
shift+Alt+上/下:上/下移一行所选代码
shift+ctrl+alt+f10(+fn)=三角形+f10:运行代码
shift+fn+f6:重命名文件
ctrl+f:搜索
ctrl+/:注释,再操作一遍,解除注释
二、Python学习
2022黑马Python学习笔记_黑马程序员python笔记-CSDN博客bbb
补充三、(三)变量
变量名不可以用关键字,即不能用函数名称!如float;即标识符,详见三、(六)
补充三、(四)数据类型
type()查看数据类型三种方式
·【使用print语句直接输出变量类型】
print( type( 13.14 ) )
·【使用变量存储type()语句的结果】 !type()语句有返回值!
a = type( 666 )
print( a )
·【使用type()语句查看变量存储的数据类型】 !变量没有类型,查看的是变量存储的数据的类型;注:字符串变量不是说变量是字符串,而是变量存储的数据类型是字符串
name = "黑马程序员"
name_type = type( name )
print( name_type )
补充三、(五)数据类型转换
任何类型都可以转换成字符串 说法正确 (加"字符串"双引号就变成字符串了);但不是所有字符串都能转换成数字(整数和浮点数),须字符串内的内容全是数字
补充三、(八)字符串扩展
字符串拼接:+号拼接没有空格 ,号拼接有空格
字符串格式化也是一种拼接方式!即格式化是不用+号的快速拼接
补充四、(四)if elif else判断语句
elif可以写多个,判断条件之间是互斥且有序的!(从上往下依次判断)
补充五、(四)while循环嵌套应用(例子)
print() #print空内容,就是输出一个换行;因为print默认是会换行输出的
print("欢迎来到中国!\n祝您旅途愉快!") #\n也是换行的效果
补充五、(五)for循环的基本语法
1.基本语法:
是遍历循环,即将待处理的数据集依次赋予临时变量。
这个待处理数据集严格来说,称之为:序列类型;序列类型指:其内容可以一个个依次取出的一种类型,包括字符串、列表、元组等等。
for 临时变量 in 字符串
for 临时变量 in range(num)
【注意】while循环控制循环条件的变量需要在while循环前设置初始值定义,而for循环的临时变量不需要
2.range语句
其实可以发现,range语句是生成一个序列类型让for循环去进行遍历循环,相当于c语言中先定义i=0,for i<10, i++这样去控制循环次数,但python更优雅!且注意python中没有i++,而是i+=1
所以,for 临时变量 in range(num)的写法可以理解为range控制循环进行多少次,而循环内不一定要使用临时变量,根据实际需要有用才用,否则就是单纯控制循环次数
3.临时变量作用域
严格来说,for循环的临时变量作用范围是循环内部,但在循环外去调用i发现也能运行,但这不是规范的写法,需在循环外部(代码一开头那里)定义一下i,那么for循环即对i的内容进行了5次覆盖,这样是规范的!且注意,在循环外面调用i,i的值是循环里最后的那个值(9)!!!
补充五、(六)continue和break
continue:跳过本次循环,执行下一次
break:退出循环
注意第二次还是有这个2,它是遇到break就会退出内层循环,结束内层循环,但是第二次它还是会进来内层循环,遇到break才退出去!不是连进去都不进去!
循环综合案例(发工资)
sum = 10000 for i in range(1,21): import random num = random.randint(1, 10) if num > 5: sum -= 1000 print(f"向员工{i}发放工资1000元,账户余额剩余{sum}元。") if sum == 0: print("工资发完了,下个月领取吧。") break else: print(f"员工{i},绩效分{num},低于5,不发工资,下一位。") continue #这个continue有和没有效果一样,老师的写法的continue是有效果
补充六、(四)函数返回值
1. return
函数体在遇到return后就结束了,所以写在return后的代码不会执行。
不要把函数返回的东西等同于print,只是我们要看到返回的东西需要print出来才能看见。比如可以函数体里面print内容,只要函数执行就会print,但它可以没有返回值(或者说其返回值是字面量None,类型是<class 'NoneType'>)。
2.None字面量
不写return语句默认是返回None,也可以主动写return None;但下面例子中有else:不允许下面没有语句所以有一点细节上不太一样而已噢!(不写return的话也要不写else:)
【1】def check_age(age): if age > 18: return "SUCCESS" else: return None result = check_age(16) if not result: print("未成年,不允许进入酒吧。")
【2】def check_age(age): if age > 18: return "SUCCESS" else: return result = check_age(16) if not result: print("未成年,不允许进入酒吧。")
【3】def check_age(age): if age > 18: return "SUCCESS" result = check_age(16) if not result: print("未成年,不允许进入酒吧。")
以上三个版本执行结果一样,【1】主动写return None【2】只写return 省略None(默认)【3】整个else不写(默认None)但在【2】中写了else:下面就不能没有语句,必须要写return这个词!
补充六、(五)函数说明文档
指在函数体前的一段注释,注意:规范书写函数说明文档,当调用函数时,鼠标悬停可以看到函数说明文档。
补充六、(七)变量作用域
【1】num = 10 def a(): print(num) def b(): num = 20 #即这里的num是局部变量,与外面的num(全局变量)不是同一个 print(num) a() b() print(num)#执行结果是10 20 10 【2】num = 10 def a(): print(num) def b(): global num#用global关键字声明函数内这个num变量为全局变量,那么和外面的num是同一个 num = 20 print(num) a() b() print(num)#执行结果是10 20 20
函数综合案例--银行ATM
money = 500000 name = input("请输入您的姓名:") def check(): """ 查询余额 :return: 返回值是当前余额 """ global money global name print("--------------查询余额-------------") print(f"{name},您好,您的余额剩余:{money}元") return money def give(give_money): """ 存款 :param give_money: 本次存款的金额 :return: 无 """ global money global name money += give_money print("---------------存款--------------") print(f"{name},您好,您存款{give_money}元成功") print(f"{name},您好,您的余额剩余{money}元") def pick(pick_money): """ 取款 :param pick_money: 本次取款的金额 :return: 无 """ global money global name money -= pick_money print("---------------取款--------------") print(f"{name},您好,您取款{pick_money}元成功") print(f"{name},您好,您的余额剩余{money}元") def main(): """ 主菜单 :return: 所输入的选择,查询余额为1,存款为2,取款为3,退出为4 """ print("--------------主菜单--------------") global name print(f"{name},您好,欢迎来到ATM。请选择操作:") print("查询余额\t[输入1]\n存款\t\t[输入2]\n取款\t\t[输入3]\n退出\t\t[输入4]\n") #后面三个需要两个\t才能做到对齐! result = int(input("请输入您的选择:")) return result while 2 > 1: num = main() if num == 1: check() elif num == 2: data1 = int(input("请输入存款金额:")) give(data1) elif num == 3: data2 = int(input("请输入取款金额:")) pick(data2) else: print("已退出界面") break
补充七、(二)3.列表的常用操作(方法)
直接重新写 看我这里
列表.方法 这样称为方法(理解为放在类中的函数称为方法)
编号 | 方法 | 语法 | 作用 |
1 | index | 列表.index(元素) | 返回值为所查找的指定元素的下表索引, 若所查找的元素不存在则报错 |
2 | =(赋值不算列表方法) | 列表[下标]=新内容 | 修改某个元素 |
3 | insert | 列表.insert(下标,元素) | 在指定下标位置插入新元素 |
4 | append | 列表.append(元素) | 在列表的尾部追加一个新元素 |
5 | extend | 列表.extend(其他数据容器) | 在列表的尾部追加一批新元素,由其他数据容器 提供的一批新元素按顺序在尾部追加 |
6 | del(关键字不算列表方法) | del 列表[下标] | 删除指定下标的元素 |
7 | pop | 列表.pop(下标) | 删除指定下标的元素,该方法有返回值,返回值为 所删除的元素,相当于取出来一个元素! |
8 | remove | 列表.remove(元素) | 在列表中从前到后搜索该元素,删除第一个匹配项,重复的多个 都想删除的话只能多次调用remove |
9 | clear | 列表.clear() | 清空整个列表 |
10 | count | 列表.count(元素) | 统计该元素在列表中的数量,返回值为数量 |
11 | len()之前学的一个函数,不算列表方法 | len(列表) | 统计列表中总共有多少个元素,返回值为数量 |
补充七、(四)数据容器(元组)
1.定义(基本语法)
元组只有一个元素时,要在后面添加,逗号!eg:t = ("hello",)。否则为字符串类型
通过下标索引取出元组的元素,语法与list的一样,即t[下标][下标].....
2.元组的操作(方法)见他人笔记
3.while循环、for循环遍历元组
与list写法同理
4.注意
元组的元素不可以修改,若元组和列表嵌套,列表内的内容可以修改
语法:元组[列表所在的下标].列表的方法
但不可以对整个列表进行替换修改,因为整个列表视为元组的元素,不可修改
补充七、(五)数据容器(字符串)
2.字符串的下标索引
把字符串看作是数据容器时,空格也是元素,占下标噢!
3.字符串的常用操作
大字符串.index(小字符串) 其返回值为第一个小字符串匹配项的起始下标
replace 原字符串不可修改,但能部分修改,此时是生成一个新字符串,不是在原字符串上做的修改
split、strip同理,都是产生一个新字符串
while、for遍历字符串:写法与list同理
补充七、(六)数据容器切片
3. 基本语法(原笔记复制过来进行了补充,看这里即可)
序列[起始下标:结束下标:步长]
* 表示从序列中,从指定位置开始,依次取出指定元素,到指定位置结束,得到一个新序列
* 起始下标表示从何处开始,可以留空,留空视作从头开始
* 结束下标(不含)表示何处结束,可以留空,留空视作截取到结尾,但这个冒号:不可省略
* 步长表示,依次取元素的间隔,省略则默认步长为1,可以省略第二个冒号:
步长1表示,一个个取元素
步长2表示,每次跳过1个元素取
步长N表示,每次跳过N-1个元素取
步长为负数表示,反向取(注意,起始下标和结束下标也要反向标记,按从前往后顺序0,1,2,3....数下标,反向标记是指起始下标大于结束下标!!!)
* 可以连着写多个切片操作,eg:new_str=str[::-1][9:14] 同理,字符串方法、数据容器切片都能连着接着写!!!
补充七、(七)数据容器(集合)
1.定义(基本语法)
*定义空的集合:变量 = set()
注意:与列表、元组、字符串不同,变量={}这样定义的是字典!(因为字典也是用{},{}定义空内容这个写法被字典占用了);print输出空集合的内容是:set() print输出空字典的内容是:{}
*去重:定义的集合中有重复元素,print 输出集合的内容将会自动去重
*无序:print输出去重后的内容,其顺序不能保证与创建顺序一致,不过再重新执行代码结果会与上一次保持一致
2.集合的常用操作(方法)
【补充】
*3 pop 有返回值:取出的元素
*5 difference 有返回值:新集合 集合1.difference(集合2) 得到一个新集合,原来的集合1和集合2不变,返回值是集合1有而集合2没有的元素
*6 集合1.difference_update(集合2) 在集合1内,删除其和集合2相同的元素,结果:集合1被修改,集合2不变,无返回值
*7 union 有返回值:新集合
*8 len(集合) 注意:若定义的集合里有重复的元素,它是去重的,len得到的返回值:去重后的元素数量!
3.集合的遍历
集合遍历不支持while循环(因为集合不支持下标索引),可以用for循环进行遍历
补充七、(八)数据容器(字典)
2.字典的常用操作(方法)
*pop 有返回值 pop即类似出栈
*keys 有返回值
*len 有返回值
支持for循环遍历:以下两种方式等效
【方式1】获取key来完成遍历 my_dict = {'周接论':88, '霖军接':99, '章学有':77} for key in my_dict.keys(): print(key,my_dict[key])
【方式2】直接对字典进行for循环,每一次循环都是直接得到key my_dict = {'周接论':88, '霖军接':99, '章学有':77} for key in my_dict: print(key,my_dict[key])
补充七、(九)数据容器通用操作
*sorted(序列) 不写则默认reverse=False 升序 输出从小到大排序好的列表
sorted(序列,[reverse=True]) 反转倒序即降序 输出从大到小排序好的列表
*max min 【拓展:字符串比较】字符串所用的字符,包括大小写英文字母、数字、特殊符号等都有其对应的ASCII码值,字符串比较大小就是基于其ASCII码值大小进行比较。
补充八、函数进阶
注意:
*位置参数和关键字参数混用时:位置参数在前,关键字参数在后
*若使用了缺省参数(默认参数):缺省参数统一放在后面(可以多个,都放在最后)
补充九、Python文件操作
*1是打开文件操作;2、3、4、5是读取文件;6关闭文件;7是自动关闭文件的一种打开文件方式
*文件对象名字 = open(name,mode,encoding="UTF-8")
name写为 "文件存储路径名称" eg:
"E:/测试.txt"
若直接写"要打开的文件名称",则认为该文件在Python project文件夹下好像
注意,在open()函数里,encoding并不是第三位参数,但是我们一般只设置这几个,所以记得要用关键字参数对encoding进行设置
*文件对象名字.read(num)
【纠正】num:所要读取的字符数!不是字节数,在UTF-8编码中,一个英文字符=1个字节,一个中文字符(含繁体)=3个字节;若不写num,则读取文件全部内容
若程序中多次调用read,那么第二次的read会在上一次read的结尾处开始读取;并且read()和readlines()混合调用也同理,都会在上一次读取结束位置续接去读取
*for line in 文件对象名字
每次循环读取到一行!!
*with open(name,mode,encoding = "UTF-8") as 文件对象名字
文件操作结束后会自动关闭文件,不会占用文件
更正九、(四)文件的追加
2.注意事项中第一行有误
a模式,文件不存在,会创建新文件
十、Python异常、模块与包
(一)了解异常
1. 异常
程序运行的过程中出现了错误
2. bug
bug就是指异常的意思,因为历史是因为小虫子导致计算机失灵的案例,所以延续至今,bug就代表软件出现错误
(二)捕获异常
1. 为什么要捕获异常
在可能发生异常的地方,进行捕获。当异常出现时,提供解决方式,而不是任由其导致程序无法运行。
2. 异常的捕获方法
1)基本语法
一般try下方只放一行尝试执行的代码
#捕获常规异常(同时也是捕获全部异常):
try:
可能要发生异常的代码
except:
如果出现异常执行的代码
#捕获指定异常(例如NameError)
try:
可能要发生异常的代码
except 指定异常名字 as 自定义的异常名字即别名:
如果出现异常执行的代码
#捕获全部异常
方式1;同捕获常规异常
方式2:
try:
可能要发生异常的代码
except Exception as 自定义异常的名字即别名:
如果出现异常执行的代码
2)异常的else、finally语法
try:
可能要发生异常的代码
except:
如果出现异常执行的代码
else:
没有异常时执行的代码
finally:
不管是否有异常都要执行的代码(比如关闭文件操作)
3. 异常的传递
异常具有传递性,可以不用到真正出现异常的那句语句处去捕获异常,函数之间存在多层调用关系,try最顶层的调用语句,就可以
(三)Python模块的导入
1. 什么是模块
模块就是一个Python代码文件,文件后缀为.py,内含类、函数、变量等,可以导入模块或功能使用
2. 如何导入模块
#导入模块
import 模块名 as 别名
as别名为模块别名可省略;通过 "." 确定层级关系;使用时:模块.功能()或别名.功能()
#导入模块的某个功能或全部功能
from 模块名 import 类/变量/函数/* as 别名
as别名为功能别名可省略;*号表示导入全部功能;使用时:功能()或别名()
【注意】模块的导入一般写在代码文件的开头位置
3. 自定义模块
1)如何自定义模块并导入
新建一个Python代码文件中正常写入代码即可,再通过from、import关键字导入(同Python内置模块导入使用)
注意:所新建文件名即模块名,要符合Python标识符命名规则(要再代码中用于导入的)
2)_ _main_ _变量的功能
if __name__ == '__main__': 代码
当模块里程序直接执行时,__name__ 变量为__main__ 条件为真,才会进入if内部执行代码;若模块被导入的,模块中的if无法进入
使用场景:在自定义模块中调用功能函数进行测试,但被导入时,执行主文件时,不要执行这句调用测试的代码
3)_ _all_ _变量的功能
__all__ = []
其为一个列表,写在模块中,那么*号导入模块全部功能时,只导入列表内的功能,即控制import*对哪些功能可以导入
4. 注意事项
当不同模块有同名功能,并同时都导入时,后导入的会覆盖先导入的,(Pycharm会提醒你,被覆盖的没有真正执行到,那句代码时灰色)
(四)Python包
1. 什么是Python包
包Python Package就是一个包含__init__.py文件的文件夹,里面可以存放许多Python模块(许多个代码文件),通过包,在逻辑上将一批模块归为一类,方便使用。(注意,若没有__init__.py文件,则为普通文件夹Directory)
2. 自定义包
1)如何创建
new新建一个Python Package即可,会自动创建__init__.py
2)如何使用
即多一个层级
【1】import 包.模块
包.模块.功能
【2】from 包 import 模块
模块.功能
【3】from 包.模块 improt 功能
功能
3)__all__变量
在__init__.py文件中,__all__ = ['my_module1'],可以控制在主代码中从包中导入模块时*的具体导入功能,from 包 import *
3. 安装第三方包
三、第二阶段Python学习
以前笔记)Python注释
在前面添加#,# 注释,该行代码成为注释,若多行时要多行都要#
三个单引号对,'''注释'''
三个双引号对,"""注释"""
第一个特殊注释是用于linux系统的指明Python解释器路径,widows系统则认为它是普通注释;第二个特殊注释是解决Python2不支持中文出现的问题
安装Python是 安装了Python.exe解释器程序;Pycharm是第三方的集成开发环境IDE(编辑器)