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代码高

posted @ 2021-04-26 18:38  我的愿望是如你所愿  阅读(144)  评论(0)    收藏  举报