Python学习笔记
基本语法
程序注释
单行注释# 多行注释 ''' '''
变量和常量
python不需要复杂的数据类型的声明,直接使用变量名称即可。
每个语句不需要;作为完结符(但使用也不会错) 当一行上定义多个变量时,可以使用分号隔开
假设一个变量不再使用,使用关键字del来释放该变量占据的内存空间
数据类型划分
type()函数用来知道一个变量或者常量的类型
python支持复数的操作
①定义复数 complex(实部,虚部)
②获取复数的实部 复数变量.real
③获取复数的虚部 复数变量.imag
④获取共轭复数 复数变量.conjugate()
布尔:可以用true和false,也可以用0和1(非0)来表示
对于字符串,Python提供预处理的三引号字符串,就是变量=""" ''''"里面内容格式什么样,输出就是什么样
键盘输入数据 使用input()函数 所有输入的类型均为str
我们可以使用转换函数进行数据类型的转换处理 int() float() bool() str()
格式化输出:
print("我今年%d岁,我在%s上学,我未来的月薪%f"%(18,'盐城工学院',888888.888))
当标记的名称与之前定义的变量名称完全一样,可以使用vars()函数获取所有的变量
age=18;school='盐城工学院';salary=88888.88; print("我今年%(age)d岁,我在%(school)s上学,我未来的月薪%(salary)f"%vars())
默认情况下,使用print()函数自带换行,我们追加end参数自定义完结符
print("你好",end="!!!!")
运算符
数字运算符
/(注意:并不是整除,结果是浮点型) //(整除运算) **(幂运算) **2乘方
字符串也可以进行乘法操作,实现重复输出(这是java和C不具备的)
关系运算符
ord()函数用于输出其字符的ASCII编码
特别之处:可以同时多个关系运算,不需要使用逻辑运算符进行连接
逻辑运算符 与and 或or 非not
位运算符
进制转换函数: 二进制bin() 八进制oct() 十进制 int() hex()
身份运算符
id()函数可以获取内存地址
使用is和is not运算符来判断是否在同一内存
分支结构
|
if 布尔表达式: 语句 |
if 布尔表达式: 语句 else: 语句 |
if 布尔表达式: 语句 elsif 布尔表达式: 语句 else: 语句 |
断言(几乎不用) 使用asert设置断言判断表达式,如果满足条件正常执行完毕,否则抛出异常
循环结构
while循环
|
while 判断: 循环语句 |
while 判断: 循环语句 else : #循环执行结束执行 语句 |
for 循环
for num in {1,2,3}: print(num,end="、")
for num in range(100): #默认从0开始,0-99 print(num,end="、")
for num in range(50,100): print(num,end="、")
for num in range(50,100,3): #默认步长为1,修改步长 print(num,end="、")
msg="hello world" for c in msg: #输出字符串的每一个字符 print(c,end="、")
chr()函数将ASCII码转换为字符 eg chr(97) a
列表
使用[],是对传统数组更高级的实现
除支持正向索引(0开始)还支持反向索引,比如索引定义为-1,表示返回最后一个元素(这个很有用,你不需要知道列表的长度)
列表里可以定义不同的数据类型,传统数组就做不到
修改列表元素:指定列表名和要修改的元素索引,再指定该元素的新值
在列表末尾添加元素append(值)
在列表中插入元素 列表名.insert(索引,值)
列表中删除元素
①使用del语句删除元素
del 列表名[索引号] 这种方式元素从列表删除后,无法再访问
② 变量=列表名.pop()
删除列表末尾的元素,我们也可以使用变量来对其进行访问。
③弹出列表中如何位置处的元素
变量=列表名.pop(索引)
④根据值删除元素
列表名.remove(值),只能删除第一个指定的元素。(可以循环,实现列表中所有指定值的元素)
组织列表
①使用sort()方法对列表进行永久性排序
如果想按相反的顺序进行排序,只需向sort()方法传递参数reverse=True
②使用sorted()对列表进行临时排序
这不影响它们在列表中的原始排列顺序
③倒序打印列表reverse()方法
④计算列表的长度len()方法
输出列表:列表可以通过for迭代输出
使用range函数
#打印出1到4 for value in range(1,5): print(value)
使用list()函数将结果直接打印成列表
numbers=list(range(1,5)) print(numbers) #运行结果:[1, 2, 3, 4]
使用range函数可以指定步长
两个星号表示乘方运算
squares=[] for value in range(1,11): squares.append(value**2) print(squares) #运行结果:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
通过列表解析只需一行代码即可生成以上代码
squares=[value**2 for value in range(1,11)]
使用列表的一部分,创建切片,指定使用第一个元素和最后一个元素的索引
列表名[第一个元素索引:最后一个元素索引]
如果没有指定第一个索引,自动从列表开头开始
也可省略终止索引,让切片终止于列表末尾 我们可以使用负数索引
支持乘法操作,和加法的连接处理
数据截取
列表对象[开始索引:结束索引:步长]
可以同时配合反向索引使用
info=['你好','我好','大家好','他好'] print("数据截片:%s"%info[1:2])
除了截取,也支持修改,删除列表对象[开始索引:结束索引:步长]=[]
判断某一数据是否在列表中,不需要迭代输出整个列表进行判断,可以使用 in 和not in 运算符
其中extend(列表)从一个列表中追加另外一个列表实现列表的扩充
copy()拷贝列表,两个列表的内容是相同的,但内存地址是不同的
如果通过一个列表对象赋给另外一个列表对象,这并不是将前列表的副本复制到新列表,而是将这两个变量指向同一个变量
执行remove(data)如果内容存在会进行删除,不存在就会抛出异常(所以一定要用in运算符进行判断)
也可以使用del列表对象[索引] 进行数据删除,但是你不知道删除了哪个数据,pop函数弥补了这一点
列表适合存储在运行期间可能变化的数据集,列表是可以修改的
对于不能变(不能修改)的列表称为元组,元组使用元括号而不是方括号来进行标识,使用索引来访问,同列表一样
我们不能修改元组的元素,但可以给存储元祖的变量赋值。
字典
字典是一系列的键-值对。
添加键-值对 通常,先创建一个空字典,在进行添加
alien_0={'color':'green','points':5}
alien_0['x_position']=0
alien_0['y_position']=20
print(alien_0)
#运行结果:{'color': 'green', 'points': 5, 'x_position': 0, 'y_position': 20}
删除键值对 del语句 删除的键-值对永远消失
del alien_0['points']
对于较长字典,定义的方式:
favourite_languages={ '1':'java', '2':'C', '3':'C++', }
遍历字典
for k,v in favourite_languages.items(): 它返回的是一个键值对列表 print(k+"'s favourite language is "+v)
遍历字典中的所有键
for k in favourite_languages.keys(): 它返回的是所有键值的列表 print(k)
加不加.keys()运行结果都是一样的(遍历字典,默认遍历所有的键)
遍历字典中的所有值
for v in favourite_languages.values(): print(v)
以上是不考虑重复的,如果想剔除重复项,可使用集合set
for v in set(favourite_languages.values()): print(v)
嵌套:将字典存储在列表中,或者将列表作为值存储在字典中
输入和函数
用户输入
input(提示文字)
输入的为字符串,通过函数int()可以将数字的字符串表示转换成数值表示
函数
在传递实参,我们可以使用位置实参,也可以使用关键字实参(传递给函数的名字-值对)
编写函数时,我们可以给每一个形参指定默认值,在调用函数时,如果给形参提供了实参,将使用指定的实参值,否则,将使用形参的默认值
使用默认值的时候,在形参列表中必须先列出没有默认值的形参,再列出有默认值的形参。
让实参变成可选的:做法是,在函数定义中最后列出该形参,并将其默认值设置为空字符串。 返回值可以返回简单值,也可以返回字典
def introduce(first_name,last_name,age=''): person={'first':first_name,'last':last_name} if age: person['age']=age return person #返回字典集 print(introduce('Sha','Tianhui',21)) #运行结果:{'first': 'Sha', 'last': 'Tianhui', 'age': 21}
我们可以向函数传递列表,将列表传递给函数后,函数就可以对列表进行修改,并且列表的任何修改都是永久性的。(这跟C语言数组都是一个道理,应该都属于应用传递)
#模拟打印每一个设计,直到没有未打印的设计为止 #打印每一个设计后,将其移到列表completed_models中 def print_models(unprinted_designs,completed_models): while unprinted_designs: current_design=unprinted_designs.pop() print("正在打印"+current_design+"......") completed_models.append(current_design) def show_completed_models(completed_models): for completed_model in completed_models: print(completed_model) unprinted_design=['小米','华为','iphone'] completed_models=[] print_models(unprinted_design,completed_models) show_completed_models(completed_models) #运行结果如下: 正在打印iphone...... 正在打印华为...... 正在打印小米...... iphone 华为 小米
上述程序中,此时的unprinted_designs列表为空,列表以被破坏,如果禁止函数修改列表,那么向函数传递列表的副本(采用切表示法创建列表的副本)而不是原件,这样只影响函数的副本而不影响原件。
print_models(unprinted_design[:],completed_models)
如果想传递任意数量的实参,那么可以采用形参*toppings 名字是可以任意取的,不一定要叫toppings
其中这个*就是让Python创建一个名为toppings的空元祖,并且将受到的所有值都封装到其中。
我们可以将位置实参和任意数量实参结合使用
函数:是将代码块和主程序分离。如果将函数存储在被称为模块的独立性文件中,再将模块导入到主程序,这样做,既可以隐藏程序代码的细节,也可以实现不同程序对函数的重用。
①导入整个模块,使用其模块的任意函数
import 模块名
②导入特定的函数
form 模块名 import 函数1,函数2
为了避免导入的函数名称可能与程序现有的名称冲突,可以使用as给函数指定别名,也可以使用as给模块使用别名
通常不建议导入一个模块的所有函数
面向对象编程
创建一个类
class Dog(): #这是一个特殊的方法,每当根据Dog类创建一个新的实例的时候,Python都会自动运行它 #这个方法的名称中,开头和末尾各有两个下划线 #形参self必不可少,必须放在其他形参前面 def __init__(self,name,age): self.name=name self.age=age def sit(self): print(self.name+"正在坐下。。。") def roll_over(self): print(self.name+"正在打滚。。。") #根据类创建实例,并且调用类中的方法 my_dog=Dog('hello',8) my_dog.sit(); my_dog.roll_over()
我们可以在方法_init_()内指定属性的初始值
继承
父类必须包含在当前文件中,且位于子类前面
定义子类,必须在括号内指定父类的名称。
class BigDog(Dog): def __init__(self,name,age): #super()是一个特殊函数,帮助Python将父类和子类关联起来 super().__init__(name,age)#初始化父类 self.color='Blue' #定义子类独有的属性 def eat(self): #定义子类独有的方法 print("那只颜色是"+self.color+"小狗在吃饭。。。。")
重写:可以重新父类的方法,可在子类中定义一个这样的方法,即它与要重写的父类同名。此时,Python不会考虑父类方法,只会考虑子类中的方法。
为了使文件更加简洁,我们可以将类存储在模块中,然后从主程序中导入所需要的模块
Python标准库
模块collections中有一个类 OrderedDict(一般字典能让信息关联起来,但他们不记录你添加键-值对的顺序,要创建字典并记录其中键-值对的添加顺序,可使用这个类)
from collections import OrderedDict favourite_languages=OrderedDict() favourite_languages['xiaoMing']='Java' favourite_languages['xiaoHong']='Python' favourite_languages['xiaoZhang']='C' for name,language in favourite_languages.items(): print(name+"'s favourite language is "+language)
编码风格:类名的每一个单词的首字母都需要大写,而不使用下划线。实例名和模块名都采用小写格式,并在单词之间加上下划线。
文件和异常
读取整个文件
#open()函数接收打开文件的名称 #Python在当前执行的文件所在的目录中查找指定的文件 #open('pi.text')返回一个表示pi.text文件的对象,然后Python将对象存储在我们将后面使用的变量中 #关键字with在不再需要访问文件后进行关闭 with open('pi.text') as file_object: print(file_object.read())
当然,我们可以使用相对路径和绝对路径来读取文件
逐行读取
with open('pi.text') as file_object: for line in file_object: print(line.rstrip()) #rstrip()函数消除这些多余的空白行
创建一个包含文各行内容的列表
with open('pi.text') as file_object: line=file_object.readlines() #readlines()从文件中读取每一行,并将其存储在一个列表中
写入文件
# open()函数提供两个实参,第一个就是要打开的文件名, # 第二个参数 'w'表示写入模式(如果指定的文件已经存在,Python将在返回文件对象前清空该文件),
#'r'读取模式,'a'附加模式(不覆盖原来的内容),'r+’读取和写入文件的模式 #如果省略了模式,那么就是'r'只读模式 with open('programming.txt','w') as file_object: file_object.write('I love programming')
异常处理
Python的异常是使用try-except代码块进行处理的。
try: print(2/0) except ZeroDivisionError: print("除数不能为0!")
else代码块,try代码块成功执行的代码都应放在else代码块中
try: ans=2/3 except ZeroDivisionError: print("除数不能为0!") else: print(ans)
如果希望程序在发生异常的时候一声不吭,就像什么也没有发生一样继续执行,那么我们可以使用Python中的pass语句。
存储数据
模块json能够将简单的Python数据结构转储到文件中,并在程序再次运行是加载该文件中的数据。
json.dump()用来存储数据,它接受两个实参,要存储的数据以及可用于存储数据的文件对象。
import json numbers=[1,3,5,7,9] with open('t2.json','w') as file_object: json.dump(numbers,file_object)
使用json.load()将这个列表读取到内存
with open('t2.json') as file_object: print(json.load(file_object))
测试代码
Python标准库中的模块unittest提供了代码测试工具
测试函数
导入模块unittest和要测试的函数,创建一个类,该类必须继承unittest.TestCase类
运行这个程序,是由以test打头的方法都将自动运行
name_function.py
def get_formatted_name(first,last): full_name=first+' '+last return full_name
test_name_function.py
import unittest from name_function import get_formatted_name class NamesTestCase(unittest.TestCase): def test_name(self): formatted_name=get_formatted_name('Sha','TianHui') self.assertTrue(formatted_name,'Sha TianHui') unittest.main
测试类
定义survey.py
#该类用于定义匿名调查问卷的答案 class AnonymousSurvey(): #存储一个问题,并为存储答案做准备 def __init__(self,question): self.question=question self.response=[] #显示调查问卷 def show_question(self): print(self.question) #存储单份调查答卷 def store_response(self,new_response): self.response.append(new_response) #显示收集到的所有答卷 def show_results(self): for result in self.response: return result
测试AnnoymousSurvey类
import unittest from survey import AnonymousSurvey class TestAnonymousSurvey(unittest.TestCase): def test_store_single_response(self): question="What language did you first learn to speak" my_survey=AnonymousSurvey(question) my_survey.store_response('English') self.assertIn('English',my_survey.show_results()) unittest.main
方法setUp()
如果测试类中包含方法setUp(),我们只需创建这些对象一次,并在每一个测试方法中使用他们。并且,Python会先执行测试类中的setUp方法,再运行各个以test_打头的方法。这样,在编写的每一个测试方法中,都可使用方法setUp()中创建对象。
Python语言优势
①可执行的伪代码,Python语言处理和操作文本文件非常简单,易于操作非数值型数据
②函数库丰富,机器学习需要使用NumPy,实现向量和矩阵操作
也需要使用绘图工具Matplotlib,绘制图形
Python语言唯一不足是性能问题,运行效率不如C语言或者Java代码高

浙公网安备 33010602011771号