python从入门到实践学习笔记_《Python编程从入门到实践》 ——基础知识篇(下) 学习笔记...

以下均为Python 3.0版本以上内容,部分内容在Python 2.7有差异

第七章 用户输入和while循环

1. 用户输入函数 input()

该函数将输入的内容全部理解为字符串

使用示例:message=input("提示字符串")

实例: name=input("Please enter your name :")

如果要用的是整形变量,则应该转换:

age = input("Your age :")

# 如果没有这步转换,会报错,因为无法拿字符串与数值比较

age=int(age)

if age>= 18 :

print("Yes!")

else:

print("No!")

2.求模运算符 %  取整除 //

#  // 是向下取整 ; % 运算最常见的是判断奇偶性

4%3 -> 1  4//3 -> 1  -9 // 2 -> -5

5%3 -> 2  5//3 -> 1

6%3 -> 0  6//3 -> 2

3.while循环

# 使用模板  执行语句块可搭配if语句使用

while 布尔语句或变量 :

执行语句块

break 跳出循环 ,continue 立即进入下一次循环(忽略continue之后的代码)

当进入死循环时,可按ctrl+C或关闭终端窗口

#删除列表中所有同名元素

nums=['1','1','2','0','2','3']

while '2' in nums:

nums.remove('2')

#输入存储到字典

1 people={}2 goon=True3 whilegoon :4 name=input("Please enter your name :")5 age=input("Please enter your age :")6

7 #存储

8 people[name]=age9

10 response=input("continue?(Yes/No)")11 if response == 'No':

# break 也行12 goon=False13

14 print (people)

注意:上面的age不用转换,转换也可以,因为键值对中的值可以是字符串,可以是整形,也可以是其他类型

第八章 函数

1.定义函数

所谓函数,在我看来就是一个解决相应问题的盒子。

形参与实参:形参就是函数解决问题所用到的实参的形容名,实参就是你要传给函数的输入数据。

只不过一般形参的取名都是由实际意义的,这样比较好理解函数用途以及理清传入的实参是什么。

模板与实例

def 函数名(形参):          def greet_user(name):

"""函数描述文档字符串"""       """问候用户"""

函数语句块              message="Hello ! "+name+" !"

print(message)

当函数有多个参数时,传递实参有两种方式:

def describe_pet(pet_name,pet_color):

a.位置实参 :实参的传入顺序与形参完全一致。

describe_pet("xiaobai","white")

b.关键字实参 :直接指定形参传入对应实参,此时顺序可任意

describe_pet(pet_color="white",pet_name="xiaobai")

定义函数时,可以给某些参数给定默认值

# 给定了默认值的参数要放到未指定的参数后面,这样Python才能正确解读所有参数。

def describe_pet(pet_color,pet_name='xiaobai'):

注意:默认值的等号两把不要有空格。

调用: describe_pet('white')

2.函数返回值

函数可以无返回值,也可以有返回值,且返回值可以是值、字符串、列表、字典等。

函数中用 return 关键字返回想要的值。

书上使用实例:

1 defbuild_person(first_name,last_name):2

3   """人名字典"""

4

5   person={'first':first_name,'last':last_name}6

7   returnperson8

9 musician=build_person('jimi','hendrix')10

11 print(musician)

3.传递列表

书上例子

1 defgreet_users(names):2

3   """问候列表中所有用户"""

4

5   for name innames:6

7     msg="Hello,"+name.title()+"!"

8     print(msg)9 usernames=[’bob,'mary','jack']10

11 greet_users(usernames)

注意:上述例子未对列表进行修改,但是这样传递列表,对列表的操作是可永久性的(会保存)。

如果不想修改列表内容,那么传递列表时应该传递列表的副本,如 greet_users(usernames[:])

有的时候,参数的数量我们并不知晓:

任意数量参数def people_of_late(class,*name):  放参数列表最后

上述情况也可以用一个列表来实现。

有时候,参数的数量,甚至类型我们都无法预知:做成多个键值对(字典参数)

def build_profile(first,last,**user_info):

1 def build_profile(first,last,**user_info):2

3   """创建个人档案"""

4

5   profile={}6

7   profile['first_name']=first8

9   profile['last_name']=last10

11   for key,value inuser_info.items():12

13     profile[key]=value14

15   returnprofile16

17 user_profile=build_profile('bob','smith',location='shanghai',field='art')18

19 print(user_profile)

4.模块

所谓模块,就是已经写好了的库函数文件,包含多个可用函数。

导入模块:import 模块名

improt turtle # turtle 是一个绘图库

使用该库文件中的函数则是用句点表示法 : turtle.pendown() 放下画笔

导入模块中的某些函数: from turtle import penup,pendown

import turtle as tl  #给库文件取别名  tl.pendown()

from turtle import penup as pup #给函数取别名 使用的话直接 pup()

from turtle import * # 不推荐这样写,这样可以把所有的库函数都导入进来,不需要使用句点调用。

# 但是可能会和你文件中定义的函数冲突。

第九章 类

1.创建和使用类

类的定义:

class Dog():

classDog():"""一个简单的狗类实例"""

def_init_(self,name,age):"""初始化属性name、age"""self.name=name

self.age=age

self.color="black"defsit(self):"""坐下动作"""

print(self.name.title()+"is now sitting.")defroll_over(self):"""打滚动作"""

print("self.name.title()+" rolled over!")

a.所有函数都有self参数(实例化时不需要传递),且要放在参数列表最前,代表实例本身,

同时也代表这个函数是类里的。 类似于java/c 中的this

b.初始化函数_init_()除self外,其他参数均为创建实例所要信息,大多数是类的属性。

c.初始化函数中可以指定某属性的初始值,指定后创建实例时不需要传入该属性的实参。

创建实例并访问其属性和函数举例:

dog_1=Dog("xiaobai",6)

print(dog_1.name)

dog_1.sit()

若是要修改属性,可以直接赋值修改,也可以写一个函数来修改(修改器),

写函数的话可以给修改加很多操作限制,比方说不能比原来值低。

2.继承

先定义一个父类,再用子类继承父类。

要点:

1.定义子类时,在参数中指定父类名(可以有多个,在括号内用逗号隔开)。

2.创建子类实例时,先要给父类的所有属性赋值。

3.创建子类时,父类必须包含在当前文件中,且位于子类前面。

1 classFather:2 def __init__(self, name, age):3 self.name =name4 self.age =age5 print("创建父类")6

7 defspeak(self):8 print("父类speak")9

10 classSon(Father):11

12 def __init__(self, name, age):13 super().__init__(name, age)14 self.tooth = 4

15 print("创建子类")16

17 defspeak(self):18 print("子类speak")19

20 son_one = Son("bob", 1)

21 son_one.speak()

上述程序运行后,控制台输出为:

创建父类

创建子类

说明:a.第一行Father后面的括号可加可不加,书上有。在python 3.9.0和 python charm 中,此处提示多余的括号。

b.super()函数表示调用父类(超类)的函数。上面子类的初始化函数是显式地调用了父类的初始化函数,这样可以添加自己的属性。

事实上,子类中没有重写_init_函数时,创建子类实例会默认先调用父类的_init_函数,使得子类拥有与父类的属性和方法。

如果子类重写了_init_函数,那么子类创建时是直接执行子类的初始化函数,不会调用父类的_init_函数。

c.如果将上面子类的_init_函数注释掉,那么控制台只输出 "创建父类" 。

d.上面子类添加了特有属性牙齿(14行),先把父类的属性都赋值好,再添加自己特有的属性。

e.(17、18行)子类重写了父类的方法,调用子类的speak方法输出为 “子类speak”

f. 如果我们在前面定义了一个tooth类,那么子类的tooth属性就可以是一个tooth类的实例(等号右边换成tooth类的构造函数)。

3.导入类

与导入函数的方法完全一样!

将上面单继承的代码保存到family.py文件中,然后在新文件中导入其中的类:

导入类: from family(文件名) import Father(类名1),Son(类名2) ……

这样导入类后,可以直接使用类的构造方法: father=Father('bob',30)

导入整个类模块: import family

这样导入后,使用类的构造方法要用句点表示法: father=famuily.Father('bob',30)

(不推荐)导入模块内所有类 from family import * :等同于代码完全复制粘贴过来

这样导入后可以直接使用,但是可能会导致冲突。

4.类编码风格

类名:驼峰命名法,每个单词首字母大写。     GoodFather

实例名和模块名:全小写,单词用下划线分隔。  my_car

第十章 文件和异常

1.从文件中读取数据

1 with open('file.txt') as file_object2 contents =file_object.read()3 print(contents)

说明:a. with 关键字 :在不需要访问文件后将其关闭,不用我们手动关闭,即调用 close()函数。

b. 文件打开函数 open() 参数为 文件路径(定位到文件名),上面直接使用文件名代表该文件存储于当前编辑的 .py文件所在的目录下。

c. as 关键字 将打开的文件内容 存到 file_object 这个对象中,之后对文件的操作就是对这个对象进行操作。

d. read()函数将文件内容以字符串的形式读出,读到文件末尾时,会返回一个空行。

open函数的文件路径参数还可以使用 绝对路径,即从盘符开始,定位到目标文件。如:E:\Python_pj\PYproject_2\file.txt

使用 相对路径,只是可以省略 E:\Python_pj\PYproject_2 ,因为这是当前.py文件所在的目录。

注意:路径中使用的是反斜杠"\" 而不是斜杠"/"

读取文件实例二

1 filename='myfile'

2

3 #读取后直接使用(with 代码块中使用)

4 with open(filename) as my_file5 #逐行读取

6 for line inmy_file7 print(line)8 #这样读取每行末尾都有一个换行符用

9 #消除空白行用 line.rstrip()

10

11

12 #读取内容存储到对象中,可在with代码块外使用

13 with open(filename) as my_file14 #存到列表中,每个元素是一行内容

15 lines =my_file.readlines()16

17 for line inlines:18 print(line.rstrip())

2.将数据写入文件

1 filename = 'myfile.txt'

2

3 with open(filename,'w') as file_object4 file_object.write("Python programming.")

函数open() 有第二个参数,表示模式。

w 写入模式 ;r 只读模式 ; a 附加模式 ; r+ 读写模式。 缺省默认只读模式。

Python只会以字符串的形式将内容写入文件,其他类型要先转换成字符串才能写入。 str() 函数可以转为字符串。

注意:如果写入的文件不存在,就会自动新建。 如果已经存在,python会在返回文件对象前清空该文件。

也就是说写入模式是覆盖原文件。

1 #附加模式写入多行数据

2 #写入的内容直接添加在文件的末尾

3

4 with open(filename,'a') as file_obj5 #要加 换行符\n 否则字符串都在同一行

6 file_obj.write("I love Python.\n")7 file_obj.write("I love programming.\n")

3.异常

如果觉得某个过程会出现异常,就使用 try-except(-else)包含该过程的代码。

1 #异常实例

2 print("Give me two numbers a and b, I will return a/b")3

4 first_num =input("first number:")5 second_num =input("second number:")6

7 #除数可能为零

8 try:9 answer=int(first_num/second_num)10

11 #除数为零异常

12 exceptZeroDivisionError:13 print("You can't divide by 0!")14

15 #else 表示无异常则继续执行的代码

16 #本部分是可选的,但一般都有,因为要继续执行程序

17 else:18 print(answer)

如果不处理异常。程序就会崩溃,控制台返回traceback。

这样可以处理找不到文件(FileNotFoundError)等异常了。

书上还用举了一个数小说文本文件中有多少个单词的例子,其大致思路是:

编写一个数单词的函数,这个函数中,处理打开文件时找不到文件的异常,

找到了就用read()函数得到所有字符串存在contents,调用contenes.split()函数

将字符串按空格分隔开,存在列表中,列表的长度就是词数。

接着把要数的文件名放在一个列表中遍历,每个调用上面的函数就完成了。

4.存储数据

使用模块json来存储数据,这样可以在不同环境下交互数据,因为json数据是通用的,可用于多种语言中。

存储数据 json.dump(数据对象,文件对象) ; 取数据 数据对象=json.load(文件对象)

1 #用json文件存数据

2

3 importjson4

5 numbers=[2,34,5,6,7,9,33,56]6

7 filename='numbers,json'

8 with open(filename,'w') as f_obj9 #json存储函数

10 #参数依次为 要存储的数据对象,文件对象

11 json.dump(numbers,f_obj)12

13 #用json文件取数据

14 #将上面存储语句换成下面这句

15 numbers=json.load(f_obj)

5.重构

重构就是你自己优化你的项目代码结构,使得代码层次分明,功能函数汇总与模块等等

一个函数,要么返回预期值,要么返回None.

第十一章 测试代码

1.测试模块

Python有专门用来做测试的模块 unittest。

当你要进行测试时,专门写测试类,测试类要继承 unittest.TestCase类,这样Python才知道如何运行你写的测试。

感觉这部分内容需要在项目中实践才能有深刻的印象,单看书本上的例子体会不深,我感觉和自己写(不用unittest类)差不多?

这里就先跳过这部分内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值