[个人向]Python基础使用技巧总结

it2022-12-30  61

[个人向]Python基础/使用技巧总结

环境:Pycharm 2019.1

根据B站up黑马程序员的投稿视频所写的个人学习笔试

链接:Python教程_600集Python从入门到精通教程(懂中文就能学会)

文章目录

[个人向]Python基础/使用技巧总结一、注释的使用单行多行 二、标准化输出三、转移字符四、模块、函数命名规则Import 注意事项函数添加注释其他函数 工程文件 五、基本数据结构ListTupleDict字符串 六、单例模式七、异常八、文件的读写九、面向对象

一、注释的使用

单行

#+一个空格,一般跟在函数上方

# 这是一个注释

多行

“”"三个引号,一般定义在文件头,类/函数定义下方

""" 这是一个多行注释 """

在pycharm里格式有问题会提示黄色/灰色波浪线,如图

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QMOvB2bm-1603162096169)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019211405974.png)]

二、标准化输出

weight = 8.5 price = 6.5 total = weight * price # 此处的(price,weight,total)相当于一个tuple元组 # %.2f 表示保留小数点后两位 print("苹果的单价是 %.2f 元/斤,购买了 %.2f 斤,需要支付 %.2f 元" % (price,weight,total)) # 输出学号000001 student_no=1 print("我的学号是 %06d" % student_no) # 打印16进制的数字 print("地址是 %x " %id(student_no)) # 输出2.5% scala=0.25 print("数据比例是 %.2f%%" %(scala*10)) # 输出1,2,3三个随机数 import random computer = random.randint(1,3) # print()结尾 print(computer,end="---\n")

三、转移字符

# 转义字符 # \t 在控制台输出一个制表符,保证文本垂直方向对齐 # \n 在控制台输出一个换行符 print("1\t2\t3") print("10\t20\t30")

输出结果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hgnOy4u4-1603162096179)(C:\Users\KASUMI\AppData\Roaming\Typora\typora-user-images\image-20201019213430798.png)]

四、模块、函数

命名规则

模块名/函数名是标识符,以数字、下划线、字母组成,不以数字开头

Import 注意事项

在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 += 1

其他函数

id(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可以查看函数

List

定义空列表,再用name_list.按下tab来显示 增加:.append(数据) list.append([1,2]) [....,[1,2]] .extend(列表) list.extend([1,2]) [....,1,2] .insert(索引,数据) 删除:del 列表[索引]<-不建议使用 .remove(数据)<-删除第一次出现的,且不存在会报错 .pop(索引)<-无索引时删除末尾数据,有则删除指定索引的数据 统计:.count(数据) 排序:.sort()升序 .reverse()逆序、反转 获得索引:.index(数据) 其他运算符: [1,2] + [3,4] [1,2,3,4] [1,2] * 2 [1,2,1,2]

Tuple

元素不能修改,用()定义 定义致函一个元素的元组(5,),只有index()和count()两个方法 应用场景:标准化输出

Dict

key只能是字符串、数字、元组,必须唯一,相当于索引,不存在会报错 删除用pop(索引) 增加用update(字典)<-会覆盖相同索引的值 min,max函数只针对key值比较 person_info = {"name" : "小明", "age" : 18, "phone" : "12345"} # 遍历字典 for key, value in person_info.items(): print(f"{key} : {value}") for k in person_info: print("%s : %s" %(k, person_info[k]))

遍历效果:[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(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)

字符串

count():小字符串在大字符串中出现的次数 index():字符串首次出现的索引,没找到会报错 isXX():是否存在XX find(str,start=0,end=len(str)):字符串首次出现的索引,没找到会返回-1 rfind():同上,从右边开始找 capitalize():第一个字符大写 title():每个单词首字母大写 lower()/upper():转换大小写 center(width):返回原字符串居中,并用空格填充到width strip():把左右两边的空白字符截掉 partition(str):把字符分成三个部分形成一个tuple(str,str,str) split(str=" ",num):str为分隔符切分字符串,若num指定好,则仅分割num+1str, str默认包含'\r','\t','\n'和空格 " ".join(seq):以空格为分隔符,将seq中所有元素的字符串表示合并成一个新的字符串 replace("A","B"):把字符串里的A换成B,但不会修改原有字符串 字符串切片:str[0:end:步长] 只切0~n-1str[0:-1:2] 逆序输出str[::-1]

六、单例模式

概念:让类创建的对象,在系统中只有唯一个实例

实现步骤:

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)]

八、文件的读写

f1 = open("文件名","r") # r,w,a读取方式,r只读,w只写(会覆盖已有内容),a追加 f2 = open("文件名","w") while True: text = f1.readline() if not text: break f2.write(text) f1.close() f2.close()

九、面向对象

三大特性:封装、继承、多态

使用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()
最新回复(0)