文章目录
- 推荐看系列
- 1、模块
- 1.1、基本模块:sys、time、os
- 1.2、 dir、__doc__、help()
- 1.3、if __ name__ == '__ main__'
- 1.4、读取文件open()
- 1.5、导入模块的四种方法
- 2、输入输出
- 2.1、单行输入
- 2.2、多行输入
- 2.3、单引号、双引号、三引号
- 3、基本概念
- 3.1、E计数法、获取数据类型
- 3.2、(算数、逻辑、连接、重复、成员关系)操作符
- 3.3、操作符:* 与 **
- 4、循环语句
- 4.1、for、while
- 4.2、continue、break、return、pass、global、None
- 4.3、将if else语句写在一行
- 5、数据类型 + 数据结构
- 5.1、数据类型:字符串型str、数值类型(整型int、浮点型float、布尔型bool、复数类型)
- 5.1.1、数据类型强转:int()、float()、str()
- 5.1.2、工厂函数:type(int) + type(int())
- 5.2、引用 —— 赋值与复制操作的区别
- 5.3、序列(sequence)常用的BIF
- 5.4、四种内建的数据结构:列表、元组、字典、集合
- 5.5、字符串(string)
- 5.5.1、格式化字符串 format()
- 5.5.2、格式化操作符 %
- 5.5.3、转义字符 \
- 6.1、函数:def
- 6.2、类和对象:class
- 6.3、继承(多重继承)
- 7、异常处理:raise + with + assert + try
- 8、类型判断:isinstance() + type()
- 备注1:Pycharm使用教程
- 备注2:Pycharm常用快捷键
推荐看系列
强烈推荐看:Python 基础(一):入门必备知识推荐看:Python基础知识点总结
介绍:Python是一门既简单又功能强大的编程语言,它注重的是如何解决问题而不是编程语言的语法与结构。详细请看:<A Byte of Python>+<小甲鱼-零基础入门学习Python>
# Python 从0开始计数,而非从1开始(MATLAB)。
# 同一层次的语句必须有相同的缩进。每一组这样的语句称为一个块。
# Python的语句末尾不需要分号(;) ———— (1)如果想要多个语句写在同一行,那么你需要使用分号(;),但强烈不建议。
# ———— (2)如果想要多个语句写在同一行,那么你需要使用逗号(,),建议(但赋值语句不可用)。
1、模块
1.1、基本模块:sys、time、os
import sys
sys.path.append('C:\\Users\\pc\\Desktop') # 在(搜索路径)列表的末尾新增一个路径。系统默认添加当前文件路径。
# 【sys模块】路径搜索:新增导入模块的路径。
import time
start_time = time.time() # 记录开始时间
end_time = time.time() # 记录结束时间
duration = end_time - start_time # 计算时长(单位:秒)
print("PC图像耗时:", duration, "秒")
import os # os(operating system, 操作系统)
# os.getcwd() # 查询当前程序的目录。
# os.listdir(path) # 列举指定目录下的所有文件名。(1)默认值是'.'代表根目录;(2)'..'代表上一层目录;(3)可自定义路径。
# os.mkdir(path) # 创建文件夹,如果该文件夹存在,则显示'FileExistsError'。其中:path需包含路径与文件夹名。
# os.remove(path) # 删除指定的文件
# os.rmdir(path) # 删除指定的文件夹。该文件夹的目录下必须为空,否则报错。
# os.removedirs(path) # 删除指定的文件夹及其多层目录。(1)如果目录下有文件,将跳过不删除。(2)最后一层目录下必须为空,否则报错。
# os.rename(old, new) # 重命名文件或文件夹。例如:os.rename('1', 'test')
# os.system('calc') # 唤醒windows系统自带的计算器
1.2、 dir、doc、help()
# dir # 如果不提供参数,将返回当前模块中定义的名称列表。
# dir(sys) # 如果提供一个模块名,将返回模块定义的名称列表。注意:输入的模块同样是列表的一部分。
print('打印print函数', dir(print)) # 打印print函数
print('打印BIF函数', dir(__builtins__)) # 打印Python提供的内置函数(BIF)列表
# __doc__:获取函数的文档字符串(即获取自定义的函数注释)。 # 例如:(max.__doc__)
print('__doc__', max.__doc__)
# help():查看函数的说明文档。 # 例如:help(__doc__)
help(max)
1.3、if __ name__ == ‘__ main__’
# if __name__ == '__main__' # 可以等同理解为C++中的int main()
# (1)在作为程序运行的时候,__name__属性的值是'__main__'。 # 即其本身作为主函数
# (2)作为模块导入的时候,__name__属性的值就是该模块的名字。 # 即其作为外部库使用,且只调用函数,忽略其函数调用(若有)。
# 备注1:该方法让Python知道导入的模块是作为程序运行,还是导入到其他程序中。
# 备注2:避免导入的模块中本身即有函数定义也有函数调用,进而导致调用时出现BUG(例如:出现双重调用现象)
1.4、读取文件open()
f = open('test.txt', 'w') # (1)读取文件模式:读模式('r')、写模式('w')或追加模式('a')。
f = open(test.txt) # (2)直接读取文件:打开一个文件,并返回一个【文件对象】。
f.close() # 关闭文件
1.5、导入模块的四种方法
##############################################
# 创建自己的模块(my_module.py文件)
# def say_hi(): # 函数定义
# print('Hi, world!') # 函数内语句
# __version__ = '0.1'
#####################
# 导入模块
# (1)导入整个模块
# 方式一: import torch # 导入整个模块,然后从中随时取
# torch.nn.Conv2d()
#
# 方式二: import torch as t # 导入整个模块,并自定义新名字
# t.nn.Conv2d()
#
# (2)从模块中导入指定成员变量
# 方式一: import torch.nn
# torch.nn.Conv2d() # 调用模块中的函数
#
# 方式二: import torch.nn as nn
# import torch.nn.functional as f
# nn.Conv2d() # 调用模块中的函数
#
# 方式三: from torch import nn
# nn.Conv2d() # 调用模块中的函数
#
# (3)从模块中导入全部成员变量(不推荐)
# from torch import *
##############################################
2、输入输出
2.1、单行输入
password = input("请输入密码:") # 输入数据(备注:只能单行输入)
print('您输入的密码是:', password) # 输出数据
2.2、多行输入
# 导入多行数据
if 1: # 永远执行
lines = int(input('请输入变量的个数:'))
else: # 不执行
lines = 0
######################################################################
# (1)输入为0,表示跳过函数;
# (2)输入为n,则循环输入n行数据。
######################################################################
text = ''
for ii in range(lines):
text += input() + '\n' # 将每一行的字符拼接到字符串中(如:'1\n2\n')
######################################################################
text_list = []
for ii in range(lines):
text_list += input() # 将每一行的字符保存到列表中(如:['3','4'])
2.3、单引号、双引号、三引号
##############################################
# 单引号、双引号、三引号
# 备注1:在Python中,无论是双引号、单引号或者是三引号,都是字符串;而不带引号,就是数字。
# 备注2:字符串是不可变的 —— 即字符串一旦创建就不能再改变它。
##############################################
# (1)单引号 + 反斜杠
print('hi! What\'s up! This is my territory.')
# (2)双引号(双引号可以显示单引号,而无需反斜杠)
print("hi! What's up! This is my territory.")
# (3)在一个字符串中,行末尾的反斜杠表示连接符,即下一行字符串是上一行的延续,属于同一行代码,不增加新的行。
print("hi! What's up! \
This is my territory.")
# (4)三引号。用法同(3)
print('''hi! What's up! \
This is my territory.''')
# (5)通过在字符串前面附加 r 或 R 来指定自然字符串 —— 即指定特殊字符不被处理
print(r'hi! What\'s up! This is my territory.')
3、基本概念
3.1、E计数法、获取数据类型
# E计数法(E或e都可以):1.5万 = 1.5e4 # 其中,E的意思就是指数10,E后边的数字就是10的多少次幂。
# 获取数据类型:(1)直接获取:type()函数
# (2)对比获取:True/False = isinstance(待确定类型数据,指定数据类型)
3.2、(算数、逻辑、连接、重复、成员关系)操作符
# 算数操作符:
# (1)整数除法返回float类型 # 例如:(2.0 == 5/2)、(2 == 5//2)、(1.0 == 3.0//2)
# (2)百分号%表示取余数 # 例如:(1 == 5%2)
#
# 逻辑操作符:and、or、not(False == not true)
# 备注:Python中可以表示:(3 <= 4 <= 5 )等同于(3 <= 4 and 4 <= 5)
#
# 连接操作符:加号(+) # 字符串相加叫做拼接;数字相加叫做求和。
# 重复操作符:乘号(*) # 例如:[12,34,12,34,12,34] = [12,34] * 3
#
# 成员关系操作符:in 和 not in # 例如:(True == 12 in [12, [2, 34]])、(False == 34 in [12, [2, 34]])
# 备注1:(1)"成员关系操作符"只能判断一个层次的成员关系;
# 备注2:(2)字符串和列表都可以使用"连接操作符"和"重复操作符"
3.3、操作符:* 与 **
# Python中的 * 与 ** 操作符的两种用法
# (1)用做运算符,即*表示乘号,**表示次方。效果等同:x**2 == numpy.power(x, 2)
# (2)用于指定函数传入参数的类型的。(详细请看函数)
# *用于参数前面,表示传入的多个参数将按照元组的形式存储,是一个元组;
# **用于参数前则表示传入的(多个)参数将按照字典的形式存储,是一个字典。
4、循环语句
4.1、for、while
# 注意:if/for/while/def/class 语句在结尾处包含一个冒号 —— 我们通过它告诉Python下面跟着一个语句块。
##############################################
# for 循环:range(start, stop, step=1) # 第一个参数(可不输入)默认为0,第三个参数(可不输入)默认为1。
# (1)range(5) —— 序列[0,1,2,3,4] range的步长为1。
# (2)range(1, 5) —— 给出序列[1,2,3,4] range的步长为1。
# (3)range(1, 5, 2) —— 给出序列[1,3] range的步长为2。
# 备注:range 仅包含左值(1),但不包含右值(5)。
for jj in range(1, 16, 5):
print(jj)
##############################################
# while 循环: (1)可以有else语句。
# (2)如果 while 循环有 else 语句,它将始终被执行。
# (3)如果 for 或 while 循环中途终止(break),对应的 else 将不执行。
number = 23
running = True # FALSE/True
while running:
break # 不执行while循环
guess = int(input("Enter an integer:"))
if guess == number:
print("Congratulation, you guessed it.")
running = False # 终止while循环
elif guess == number:
print("No, need higher.")
else:
print("No, need lower.")
else:
print("the while loop is over.") # 跳出循环后执行
4.2、continue、break、return、pass、global、None
# continue语句: 跳过当前循环块中的剩余语句,然后继续进行下一轮循环;
# break语句: 停止并跳出当前循环体;
# return语句: 跳出函数并返回一个值;
##############################################
# pass语句 在Python中表示一个"空"的语句块;
# global语句: 全局变量声明。如:global x = 3
# None 表示"空"的特殊类型。如:return None
4.3、将if else语句写在一行
# 常用方法
if alpha > 7:
beta = 999
elif alpha == 7:
beta = 99
else:
beta = 0
beta = 999 if alpha > 7 else 99 if alpha == 7 else 0
# 断句为:
# beta =
# 999 if alpha > 7
# else 99 if alpha == 7
# else 0
# 总结如下
beta1 = (True)打印A if True else (False)打印B
beta2 = (True)打印A if True else ((True)打印B if True else (False)打印C)
5、数据类型 + 数据结构
5.1、数据类型:字符串型str、数值类型(整型int、浮点型float、布尔型bool、复数类型)
# Python的变量在使用时不需要声明或定义数据类型,直接赋值即可。系统会自动依据赋值内容给定数据类型。
# 区别:(1)Python有字符串类型,但没有char字符类型。(2)没有switch语句。
5.1.1、数据类型强转:int()、float()、str()
5.1.2、工厂函数:type(int) + type(int())
# 内置函数(Built-in Functions, BIF)转换为工厂函数:
# type(int) # class类型
# type(int()) # int 类型 # 同理:int()/float()/str()/list()/tuple
5.2、引用 —— 赋值与复制操作的区别
# <引用> ———— 赋值操作+复制操作的区别
# 备注1:在python中,【赋值变量操作】则其中任意一个有变动,另一个变量自动跟随变动。 例如:my_thing = shop_thing
# 备注2:在python中,【复制变量操作】可以实现新建一个全新变量,且新变量有任何变动,原变量不改变。 例如:my_thing = shop_thing.copy()
##############################################
shop_list = ['apple', 'mango', 'carrot', 'banana']
my_list = shop_list # 当前shop_list与my_list的元素相同
del shop_list[0] # shop_list 与 my_list 将同时删除第一个元素
shop_list[0] = 'ni_hao' # shop_list 与 my_list 将同时增加元素
print('shop_list', shop_list)
print('my_list', my_list)
del my_list[0] # my_list 与 shop_list 将同时删除第一个元素
print('shop_list', shop_list)
print('my_list', my_list)
5.3、序列(sequence)常用的BIF
# <6 序列 sequence>
# 【列表、元组和字符串】都属于序列;序列是一种统称,而不是具体的数据类型。
# 备注:索引可以是负数,从序列末尾开始计算。例如:shop_list[-1], 表示序列的倒数第一个元素(即最后一个元素)
#
# 下面介绍【序列的常用BIF】
# (1)list([iterable]) # 将可迭代对象转换为列表
# (2)tuple([iterable]) # 将可迭代对象转换为元组
# (3)str(obj) # 将obj对象转换为字符串(数据类型强转)
# (4)len(sub) # 返回序列或集合的长度(可用于列表/元组/字符串)
# (5)max(sub) # 返回序列或集合中最大值(可用于列表/元组/字符串)
# (6)min(sub) # 返回序列或集合中最小值(可用于列表/元组/字符串)
# (7)sum[iterable, start] # 返回序列的总和:(可选参数)start表示从该值开始累加,默认值0。
# (8)sorted(iterable, key=None, reverse=False) # 返回排序后的列表。区别:列表的内建方法sort()实现列表原地排序,而sorted()是返回一个排序后的【新列表】。
# (9)reversed(sequence) # 返回逆向迭代序列的值。区别:列表的内建方法reverse()实现原地翻转,而reversed()是返回一个翻转后的【迭代器对象】。
5.4、四种内建的数据结构:列表、元组、字典、集合
# Python 有四种内建的数据结构:列表、元组、字典、集合
# <1 列表 list []>
# <2 元组 tuple (,)>
# <3 字典 dict {键值对}>
# <4 集合 set {}>
#
# <5 字符串 string>
# <6 序列 sequence>
############################################################################################
# <1 列表 list []> ———— 方括号
# 列表初始化1:list_temp = ['Python', 'Elephant', 'Penguin']
# 列表初始化2:list_temp1 = list("Fish delicious") # 将字符串的每个字符存放到列表中。
# 列表初始化3:list_temp2 = list((1,2,3,4,5,6)) # 将元组中的每个元素迭代存放到列表中。
# 列表初始化4:list_temp3 = list([list_temp]) # 将可迭代对象转换为列表
# (1)列表可以存放任何类型的数据,包括:整型、字符串、浮点型、列表、空列表等等。
# (2)通过索引值[]获取列表元素:list_temp[1]
# (3)[a, b]:只包含开始位置a,但不包含结束位置b。 例如:list_temp[0:2]
##########################################
list_temp = [1, '小甲鱼', 3.14, [1,2,4], []] # 列表初始化
print('列表:', list_temp)
# 向列表添加元素
list_temp.append('rice') # append():在列表末尾 - 增加(只能一个)元素。
list_temp.extend([7, 1, 9]) # extend():在列表末尾 - 添加列表(可实现一次添加多个元素)。
list_temp.insert(1, 0) # insert():在列表的任意位置插入元素。第一个参数表示列表中带插入的位置,第二个参数表示带插入的元素。
# 从列表删除元素
list_temp.remove('小甲鱼') # remove:删除列表元素,但不能指定位置。
list_temp.pop() # pop():弹出列表中的最后一个元素(默认); pop(k):弹出索引值 k 对应的元素。
del list_temp[1] # 删除列表中索引值 k 对应的元素; del list_temp:删除整个列表
# 备注:del是一个语句,而不是列表的方法,故不必在后边加上()。
print('列表:', list_temp)
##########################################
# 列表分片 ———— "拷贝"原列表得到一个新列表(两者独立);即新列表改变,原列表保持不变。
# list_temp[0:2] # 获取列表中第一个到第二个元素(步长默认1)
# list_temp[:] # 获取整个列表(步长默认1)
# list_temp[2][1] # 获取列表中的列表元素
# list_temp[::-1] # 倒序输出列表中所有元素
# 备注:第一个参数(起点)默认0,第二个参数(终点)默认最后一个元素。第三个参数(步长)默认1,正数表示从前向后,负数则相反。
##########################################
temp_count = list_temp.count(3.14) # count():计算该元素在列表中出现的次数
temp_index = list_temp.index(3.14) # index():返回该元素在列表中的位置
temp_reverse = list_temp.reverse() # reverse():将整个列表原地翻转
# temp_sort1 = list_temp.sort() # sort():对列表的元素进行(从小到大)排序,默认值sort(reverse=False)
# temp_sort2 = list_temp.sort(reverse=True) # sort(reverse=True):对列表的元素进行(从大到小)排序
############################################################################################
# <2 元组 tuple (,)> ———— 圆括号+逗号
# 元组初始化1:tuple_temp = ('Python', 'Elephant', 'Penguin')
# 元组初始化2:tuple_temp1 = tuple([tuple_temp ]) # 将可迭代对象转换为元组
# (1)逗号是元组类型的关键,圆括号只是起到补充的作用。 【例如】整型:temp1 = (1) 元组类型:temp2 = 1,2,3
# (2)逗号是必须的,圆括号也是必须的。 【例如】元组类型:temp3 = (1,)
# (3)元组和列表十分类似。区别:列表可以任意修改列表中的元素,但元素(与字符串一样)定义后不可修改元组中的元素,否则报错。
# (4)由于元组是不可改变的,但下面几种方法可以直接应用在元素上:拼接操作符+重复操作符+关系操作符+逻辑操作符+成员关系操作符。
# 用方括号 - 来访问元组元素: tuple_temp[2]
# 用分片 - 来复制元组元素: tuple_temp[2:]
##########################################
# 更新和删除元素 ———— 元组是不可改变的,是列表分片的形式拷贝可以 ———— 通过拷贝现有的字符串构造一个新的字符串的方式
tuple_temp = ('Python', 'Elephant', 'Penguin')
tuple_temp1 = tuple_temp[:2] + ('小甲鱼',) + tuple_temp[1:]
print('元组:', tuple_temp1)
############################################################################################
# <3 字典 dict {键值对}> ———— 花括号
# 字典初始化1:dict_temp1 = {'key1': value1, 'key2': value2}
# 字典初始化2:dict_temp2 = dict((('key1', value1), ('key2', 2), ('key3', 2), ('key4', 2)))
# (1)键/值对: 用冒号分割(后面需要一个空格)
# (2)而各个对之间: 用逗号分隔;
# (3)每一对键值组合称为【项】
# (4)键必须独一无二,而值可以取任何数据类型,但必须是不可变的。(如:数字/字符串/列表/元组/字典)
# (5)直接给字典的键赋值:如果键存在,则改写对应的值;如果不存在,则自动新增一个键并赋值。
# 字典和序列不同,序列讲究顺序,字典讲究映射,但不讲顺序。
# 字典是Python中唯一的映射类型。【映射】指两个集合之间的元素存在'对应'关系。
dict_temp = {1: 1, 'str2': 'str', 'list3': [1, 'list'], 'tuple4': (1,), 'dict5': {'dict': None}}
del dict_temp['dict5'] # 通过键索引直接删除一个键值对:key-value pair
dict_temp['add3'] = {1: 'value'} # 增加一个键值对:key-value pair
##########################################
dict_keys = dict_temp.keys() # keys():用于返回字典中所有的键
dict_values = dict_temp.values() # values():用于返回字典中所有的值
dict_items = dict_temp.items() # items():用于返回字典中所有的键值对(项)
##########################################
dict_get1 = dict_temp.get('key1') # get():访问字典项。若键不存在,则返回默认值:None。
dict_get2 = dict_temp.get('key1', '木有') # get():访问字典项。若键不存在,则返回默认值:'木有'。
dict_num = 3 not in dict_temp # 判断键(3)是否在字典中
##########################################
dict_temp.pop(1) # pop():弹出给定键对应的值(删除该键值对)
dict_temp.popitem() # popitem():弹出最后一个项
print('字典:', dict_temp)
dict_temp3 = dict_temp.copy() # copy():复制字典
dict_temp3.clear() # clear():清空字典中所有的项
############################################################################################
# <4 集合 set {}> ———— {}
# 集合初始化1:set_temp1 = {1,2,3,4,5,4,3,2,1}
# 集合初始化2:set_temp2 = set([1,2,3,4,5,4,3,2,1])
# (1)集合具有唯一性,即集合中相同的参数将只保留一个; 输出结果:set_temp1 = {1,2,3,4,5}
# (2)集合是无序的(集合中的元素初始化后会乱序显示),故不能索引集合中的任何一个元素,但可以通过循环迭代将数组读出来;
# 成员关系操作符(in/not in)判断元素是否在集合中:0 in set_temp1
##########################################
set_temp = {1, 2, 3, 4, 5, 4, 3, 2, 1}
# frozenset(set_temp ) # 将集合元素冰冻起来,即不能增加或删除集合中的元素
set_temp.add(9) # add():添加集合元素
set_temp.remove(2) # remove():删除集合元素
############################################################################################
5.5、字符串(string)
# <5 字符串 > ———— 单引号/双引号/三引号
# 字符串初始化:str_temp = '123456789'
# (0)C语言用单引号表示字符类型,用双引号表示字符串类型。
# (1)Python中没有字符(char)类型。对于Python而言,字符就是长度为1的字符串。
# (2)字符串和元组一样,即字符串定以后不可修改其中的字符(如:赋值),否则报错。
# (3)通过拼接原字符串的各个部分得到新字符串的方式,原字符串未改变,而是构建了新字符串。
# (4)由于字符串是不可改变的,但下面几种方法可以直接应用在字符串上:拼接操作符+重复操作符+关系操作符+逻辑操作符+成员关系操作符。
# 用方括号 - 来访问字符串元素: str_temp[2]
# 用分片 - 来复制字符串元素: str_temp[2:]
##########################################
str1 = 'I love delicious food.'
str2 = str1 + str1[:6] + ' ' + '插入的字符串' + str1[6:]
print('字符串:', str2)
##########################################
str2_count = str2.count('love', 0, 30) # count():查找子字符串(在自定义区间内)出现的次数
str2_find = str2.find('love', 0, 30) # find():查找子字符串在该字符串的位置(返回第一个字符的索引值,否则返回-1)
str2_index = str2.index('love', 0, 30) # find():查找子字符串在该字符串的位置
str2_replace = str2.replace('food', 'noodles') # replace():替换指定的字符串
str2_join1 = '*'.join('Eating') # join():以字符串(*)作为分隔符,插入到字符串的每个字符之间
str2_join2 = '_'.join({'I', 'love', 'Eating'}) # join():以字符串(_)作为分隔符,插入到集合中的每个元素之间(出现乱序输出)
print('插入字符join *:', str2_join1)
print('插入字符join _:', str2_join2)
5.5.1、格式化字符串 format()
# <5.1 格式化字符串 format()> ———— 用变量的值代替格式符
# 接收位置参数{0} + 关键字参数{b}(注意:点运算符)
# 如果位置参数与关键字参数一起使用,那么位置参数{0}必须在关键字参数{b}之前,否则报错。
format_temp1 = '{0} 不喜欢 {1}' .format('猫', '吃白菜')
format_temp2 = '{a} 不喜欢 {0}' .format('吃白菜', a='猫')
format_temp3 = '{{a}}' .format('不打印') # 输出结果:'{0}'
# 位置参数'不打印'没有被输出,因为{0}的特殊功能被外层的大括号{}剥夺。
5.5.2、格式化操作符 %
# <5.2 格式化操作符 %> ———— 字符串独享的操作符
# %c —————— 格式化(整数转)字符(串)及其ASCII码 例如:print('%c' % 97) 输出结果:'a'
# %s —————— 格式化(数字转)字符串 例如:print('%s' % 97.12) 输出结果:'97.12'
# %o —————— 格式化(整数转)无符号八进制数 例如:print('%o' % 97) 输出结果:'141'
# %d —————— 格式化(整数/浮点数转)十进制数 例如:print('%d' % 97.12) 输出结果:'97'
# %x —————— 格式化(整数转)无符号十六进制数 例如:print('%x' % 97) 输出结果:'61'
# %f —————— 格式化浮点数(可指定小数点后的精度) 例如:print('%5.1f' % 27.658) 输出结果:'27.7'
# %e —————— 用科学记数法格式化浮点(等同 %E) 例如:print('%.2e' % 148500000.123456) 输出结果:'1.49e+08'
5.5.3、转义字符 \
# <5.3 转义字符 \>
# \' ———— 单引号 \r ———— 回车符
# \" ———— 双引号 \f ———— 换页符
# \a ———— 发出系统响铃声 \o ———— 八进制代表的字符
# \b ———— 退格符 \x ———— 十六进制代表的字符
# \n ———— 换行符 \0 ———— 表示一个空字符
# \t ———— 横向制表符TAB \\ ———— 反斜杠
# \v ———— 纵向制表符
6.1、函数:def
# <函数 Func> —— def hello(a, b=1, c=2)
# (1)形参 - 形式参数:函数创建并定义过程中小括号里的参数
# (2)实参 - 实际参数:函数被调用的过程中传递进来的参数
# 1、普通参数:又叫位置参数。即未指定形参变量名的参数。 例如:hello(a, b)
# 2、关键字参数:在函数传入实参时指定形参的变量名。 例如:hello(a=0, b=1,, c=2)
# 3、默认参数:在函数定义时就赋予了默认值的参数。 例如:def hello(a=0, b=1, c=2)
#####################
# 4、收集参数(元组):当需要传入元组(多个参数),需要在参数前加上星号(*)。即C语言中用指针传数组/结构体。
# 例如:def test(*params, c=1) # 调用:params = (1, 2); test(*params)
# 5、收集参数(字典):当需要传入字典(多个参数),需要在参数前加上两个星号(**)。
# 例如:def test(* *params, c=1) # 调用:params = {'a': 1, 'b': 2}; test(* *params)
#####################
# return:可以利用列表/元组打包多种类型的值返回。 # 例如:return [1, '小甲鱼', 3.14] or return 1, '小甲鱼', 3.14
# 如果没有return语句,系统将默认返回None。故Python中的函数都有返回值。
##############################################
def hello(a, b = 1, c = 2):
print('Hello', a+b+c)
return [1, '小甲鱼', 3.14]
print(hello(3, 7, 10)) # a = 3; b = 7; c = 10;
hello(25, c = 24) # a = 25; b = 1; c = 24;
hello(c=50, a=100) # a = 100; b = 1; c = 50;
# 备注1:函数的输入参数没有顺序要求:在函数时,a在c之前定义,但可以在a之前【指定参数c】进行赋值。
# 备注2:默认参数需要排布在所有参数的末尾。
6.2、类和对象:class
# <类和对象> ———— 对象=属性+方法(变量+函数)
# (1)对象的特征叫做'属性'; 对象的行为叫做'方法'。
# (2)【创建一个对象】,也叫【类的实例化】,被实例化的对象叫作【实例对象】
# (3)【类名】约定大写字母开头; 【函数】用小写字母开头
# 每个对象的方法都会有一个self参数:由于同一个类可以生成无数对象,self就相当于在很多个相同的对象中表面身份。相当于C++的this指针。
# 在Python中,(默认)对象的属性和方法都是公开的,可以直接通过点操作符(.)进行访问。
# 定义私有变量:"__变量名/函数名" 例如:p.__name # 其中p是实例对象
# 访问私有变量:"_类名__变量名" 例如:p._Pearson__name
##############################################
class Pearson: # 类名:Pearson
def __init__(self, name):
self.name = name
def kick(self): # 函数:kick
print('%s是我, 谁敢打我?' % self.name)
p = Pearson('西瓜') # 类的实例化,p为实例对象
p.kick() # 调用实例对象的方法
# 备注:class(类)、类对象(Pearson)、实例对象(p)
6.3、继承(多重继承)
# <继承>
# 被继承的类: 基类/父类/超类(Fish)
# 继承者: 子类(Shark) ———— 子类可以继承它的父类的任何属性和方法。
# <多重继承>: 即同时继承2个以上的类对象,若类之间有继承,则子类必须在前,否则报错。提示:如非必要,请尽量避免使用,有时候会出现不可预见的BUG。
# 备注:若子类中定义的方法或属性与父类中有同名,则子类会自动覆盖父类对应的方法或属性。
# super()函数:能自动找到(继承的)基类的方法,而且默认已经传入了self参数(即无需再输入self,故没有显示)。
##############################################
class Fish: # 定义一个类对象Fish
def __init__(self):
self.move_forward = True
class Shark(Fish): # 定义一个类对象Shark,并【继承】父类对象Fish
def __init__(self):
super().__init__() # 等同于Fish.__init__(self)
self.hungry = True
class Ocean(Shark, Fish): # 定义一个类对象Ocean,并【多重继承】父类对象Fish、Shark
print('海中有鱼,也有鲨鱼') # 若类之间有继承,则子类必须在前,否则报错。
7、异常处理:raise + with + assert + try
# <异常处理>
# (1)try...except语句 ———— 如果try语句有异常,则执行except语句,打印自定义消息提示。
# (2)Try...finally语句 ———— 无论异常发生与否,都将执行 finally 语句。
# (3)Try...except...finally语句 ———— 如果try没有异常,则只执行finally语句。如果try有异常,则同时执行except与finally语句。
# (4)with语句(与open()一起使用) ———— with语句将在文件打开后自动关闭文件。
# (5)raise语句引发异常(即已知在什么情况下会发生异常,异常后报错提示)
# (6)assert(1 > 4) # assert语句:断言该语句失败,失败后报错提示:AssertionError
##############################################
while 1:
try:
with open('1.txt') as f:
print('我没错,我永远是对的')
except FileNotFoundError:
print('出错啦')
finally:
print('回家收衣服')
# if 1/0
# raise ZeroDivisionError('除数不能为0')
8、类型判断:isinstance() + type()
#############################################################
# 判断实例对象是否是已知的类型
# 方法一:isinstance(object, classinfo)
# 方法二:type(object) == classinfo
#############################################################
a = 9.0
print(type(a) == int) # False
print(type(a) == float) # True
print(isinstance(a, int)) # False
print(isinstance(a, float)) # True
print(isinstance(a, (str, float, int, list))) # 只需要属于元组中的任意一个,即返回True
type与isinstance的区别
#############################################################
# type(): 不会认为子类是一种父类类型,不考虑继承关系。
# isinstance(): 会认为子类是一种父类类型,考虑继承关系。
# 如果要判断两个类型是否相同推荐使用:isinstance()
#############################################################
class Person(object):
def __init__(self, name, gender):
self.name = name
self.gender = gender
class Student(Person):
def __init__(self, name, gender, score):
super(Student, self).__init__(name, gender)
self.score = score
class Teacher(Person):
def __init__(self, name, gender, course):
super(Teacher, self).__init__(name, gender)
self.course = course
p = Person('Tim', 'Male')
s = Student('Bob', 'Male', 88)
t = Teacher('Alice', 'Female', 'English')
print(isinstance(p, Person)) # True
print(isinstance(s, Person)) # True
print(isinstance(t, Person)) # True
print(type(p) == Person) # True
print(type(s) == Person) # Fasle
print(type(t) == Person) # Fasle
备注1:Pycharm使用教程
Pycharm最全中文教程 入门教程 完整版PDF
备注2:Pycharm常用快捷键
Pycharm常用快捷键 | 说明 |
Ctrl+C | 强制终止正在运行的程序 |
Ctrl+N | 查找所有的类的名称 |
Ctrl+/ | 注释代码(或取消注释) |
Ctrl+鼠标左键 | 点击变量转到方法定义处 |
Ctrl+Tab | 在窗口间进行切换 |
Ctrl+Z | 撤销键入 |
Ctrl+Shift+Z | 恢复键入 |
– | – |
F7 | 单步执行(进入函数) |
F8 | 单步执行(跳出函数) |
F9 | 运行到下一个断点 |
Shift+F9 | 调试Debug |
Shift+F10 | 运行RUN |
– | – |
Ctrl+Shift+up | 快速上移某一行 |
Ctrl+Shift+down | 快速下移某一行 |
Ctrl+Alt+L | 格式化代码(规范化) |
Ctrl+Alt+左箭头 | 返回到前一个光标的位置 |
Ctrl+Alt+右箭头 | 返回到后一个光标的位置 |
Ctrl+Shift+F7 | 高亮选中的单词。F3移动到下一个,Esc取消高亮 |
Pycharm 常用快捷键 |