环境:Pycharm 2019.1
根据B站up黑马程序员的投稿视频所写的个人学习笔试
链接:Python教程_600集Python从入门到精通教程(懂中文就能学会)
#+一个空格,一般跟在函数上方
# 这是一个注释“”"三个引号,一般定义在文件头,类/函数定义下方
""" 这是一个多行注释 """在pycharm里格式有问题会提示黄色/灰色波浪线,如图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QMOvB2bm-1603162096169)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019211405974.png)]
输出结果如下:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hgnOy4u4-1603162096179)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019213430798.png)]
模块名/函数名是标识符,以数字、下划线、字母组成,不以数字开头
在import时便会执行模块里没有缩进的代码块
例如在一个hm_九九乘法表的模块里定义一个multiple_table()函数
def multiple_table(): """ 函数写注释的方法,在函数使用时按ctrl+Q可显示此注释 """ row = 1 while row <= 9: col: int = 1 while col <= row: print("%d *%d = %d" % (col, row, col * row), end='\t') col += 1 print("")在另一个py文件里导入时会默认执行该函数
import hm_04_九九乘法表函数导入时就会在输出栏出现如下效果:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TqXSkp0x-1603162096181)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019214044764.png)]
可以在一个叫hm_模块的模块里用__name__关键词来区分模块的使用部分和测试部分:
def say_hello(): print("你好你好") # 如果直接执行模块, if __name__ == "__main__": print(__name__) say_hello() # 在另一个文件import后say_hello()函数就不会执行了 import hm_模块 hm_模块.say_hello()注意事项:
两个模块有同名方法,后导入覆盖先导入
不建议使用import *,导致排查问题麻烦
写好函数后光标放在函数名上点击小灯泡,选择 Insert documentation string stub加入函数注释
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YSPCnXqP-1603162096187)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019215237878.png)]
def print_lines(char , times, rows): """ :param char: :param times: :param rows: """ row = 0 while row < rows: print(char * times) row += 1id(s):显示s的内存地址
hash(s):显示s(不可变类型)的hash值,dict中的key值是不可变的
利用元组交换两个两个值 a,b = b,a
指定函数默认参数必是参数最后一个
例如:
def sort(..... , reverse=False)多值参数
def demo(num, *args, **person): """ *args是元组,**person是字典,在接受参数不确定时使用 传入参数时,若要指定类型,用拆包语法:demo(*(),**{}) """只有一个主程序执行入口,其他都是工具函数
#! /usr/bin/python3 在主文件首航增加shebang符号(#!),使得不用指定解释器即可在终端运行.py文件基本的代码结构
#! #路径 import 模块 全局变量(增加g_或者gl_前缀,如gl_name) 定义类 定义函数 执行代码 if __name__ == "__main__":显示该结构下的自带函数
name_list = [] name_list. #此处按下tab可以查看函数遍历效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eel7UBZG-1603162096192)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019223535911.png)]
# 完整的for循环遍历:for 之后接 else students=[ {"name": "阿土"}, {"name": "小美"} ] # 在学生中搜寻指定的姓名 # 完整的for循环遍历:for 循环运行完之后运行 else find_name = "小明" for stu in students: if stu["name"] == find_name: print("找到了 %s" %find_name) break else: print("找不到 %s" % find_name)概念:让类创建的对象,在系统中只有唯一个实例
实现步骤:
1、定义一个类属性,初始值是None,用于记录单例对象的引用 2、重写__new__方法 3、如果类属性is None,调用父类方法分配空间,并在类属性中记录结果 4、返回类属性中记录到的对象引用 class MusicPlayer(): # 记录第一个被创建对象的引用 instance = None # 实现只执行一次初始化动作 init_flag = False def __init__(self): # 1. 判断是否执行过初始化动作 if MusicPlayer.init_flag: return # 2.如果没有执行过,执行初始化动作 print("初始化播放器") # 3. 修改类属性的标记 MusicPlayer.init_flag = True def __new__(cls, *args, **kwargs): # 1.判断类属性是否是空对象 if cls.instance is None: # 2.调用父类方法为第一个对象分配空间 cls.instance = super().__new__(cls) # 3.返回类属性保存的对象引用 return cls.instance player1 = MusicPlayer() print(player1) player2 = MusicPlayer() print(player2) # 初始化方法因为执行了两次MusicPlayer(),会执行两次__init__方法执行效果,可知player1,player2的地址一样,即只实例化了一个对象
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KgrhVGhh-1603162096196)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019232112136.png)]
new__方法是由Object基类提供的内置静态方法,作用是分配空间,返回对象的引用,作为第一个参数传递给__init
重写方法:
一定要return super().__new__(cls),否则解释器得不到对象引用,不会调用初始化方法 一定要主动传递cls参数,__new__(cls)是一个类方法设计一个demo()程序,输入一个整数是否是8的因数,是则返回与之相乘得8的另一个因数,若不是则主动抛出异常:不能被8整除
def demo(): num = int(input("请输入一个整数:")) if ( 8 % num) == 0: return 8 / num # 若无法整除,捕获未知错误 else: print("主动抛出异常") ex = Exception("不能被8整除") # 主动抛出异常,相当于自定义异常 raise ex try: demo() except ZeroDivisionError: print("除零错误") except ValueError: print("请输入正确的整数") except Exception as result: # 处理未知错误 print("未知错误 %s" % result) else: # 没有异常才会执行的代码 print("没有异常才会执行的代码") finally: print("无论是否有异常,都会执行的代码") # 以下代码必然运行 print("-" * 50)尝试上述代码:
输入0
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Bt7T10U0-1603162096198)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019235412647.png)]
输入字符或者小数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mmGgvjau-1603162096200)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019235425043.png)]
输入不是8因数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1qTasZOn-1603162096203)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019235352647.png)]
输入2
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4SErAZ2q-1603162096205)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019235514949.png)]
三大特性:封装、继承、多态
使用dir(demo())查看demo()所有的内置函数
class里(实例)方法的第一个参数是self,即solve(self),self : 访问对象的属性,调用其他对象的方法
对象的内置方法: __init__(self):相当于构造函数 __del__():析构函数 __str__():返回对象的描述信息str,用print()输出,默认是对象的内存地址对象的私有方法/属性:
__age, __secret__() 子类也无法访问或者使用,只有父类内的方法能够使用is 和 ==的区别:
is 和is not判断的是两者的内存地址是否相同,相当于id(a)==id(b)
== 判断值是否相等
支持多继承,所有类都是Object的子类
class C(A,B): pass # 显示继承顺序,先A后B # 父类里有同名方法/属性时,继承第一个父类的方法/属性 print(C.__mro__)定义类方法@classmethod , 函数参数只有cls
定义静态方法@staticmethod
class Tool: count: int = 0 @classmethod def show_tool_count(cls): print("工具对象的数量 %d" %cls.count) @staticmethod def use(): # 不访问实例属性/类属性,直接用类名调用 print("工具要使用") def __init__(self,name): self.name = name Tool.count += 1用类名获取类属性,实例对象可以改变对象的属性,但无法改变类属性
Tool.show_tool_count() tool1 = Tool("斧头") print("工具对象的总数是 %d" % tool1.count) # 结果为1 Tool.show_tool_count() # 结果为1 tool1.count = 4 print("工具对象的总数是 %d" % tool1.count) # 结果为4 Tool.show_tool_count() # 结果为1 tool2 = Tool("榔头") tool3 = Tool("水桶") print("工具对象的总数是 %d" % tool1.count) # 结果为4 Tool.show_tool_count() # 结果为3 Tool.use()