【学习随笔】python编程从入门到实践 笔记整理汇总

备注:个人学习笔记,仅用于个人学习,侵权勿删

目录

备注:个人学习笔记,仅用于个人学习,侵权勿删

 

1.python安装(略)

 2.变量和简单数据类型

2.2变量

2.2.1 变量命名规则:

2.2.2使用变量名时避免命名错误

2.3字符串

 2.3.1 将串中字母大小写(title、upper、lower)

2.3.2 拼接字符串,用+号

2.3.4 删除空白符(rstrip、lstrip、strip)

2.3.5 python2和python3的print

2.4数字

2.4.1整数

2.4.2浮点数 

2.4.3 字符串转换函数 (str)

2.4.4 python整数取整,保留小数用浮点数

2.5 python注释用# 

3列表简介

3.1列表是什么

3.1.1 列表访问元素(依靠下标) 

3.1.2 列表索引从0开始而不是1

3.1.2 列表索引特殊语法(负数下标)

3.1.3 通过索引使用列表各个值

3.2 列表修改、添加和删除元素 

3.2.1 修改列表元素(利用索引)

3.2.2 在列表中添加元素(append、insert)

 3.2.3 从列表中删除元素(del、pop、remove)

 3.3组织列表

3.3.1 列表排序(sort、sorted)

3.3.3 逆序列表(reverse) 

3.3.4  列表长度(len)

 3.4 列表索引错误总结

4.操作列表 

4.1遍历列表

4.1.1 深入研究循环(缩进内为一个块) 

4.2避免缩进错误 

4.2.1 忘记缩进 / 不必要的缩进 / 循环后不必要的缩进

4.2.2 遗忘了冒号(:)

4.3创建数值列表

4.31 生成一系列的数字(range)

4.3.2用range创建列表(list、range)

4.3.3对数字执行简单统计(max、min、sum)

4.3.4列表解析(一行代码生成列表)

4.4使用部分列表

4.4.1切片

4.4.2遍历切片

4.4.3复制列表

4.5元组

4.5.1定义元组

4.5.3修改元组变量

5 if 语句

5.1 条件测试

5.1.1 检查字母考虑大小写,数字比较

5.1.2 检查多个条件(and、or)

5.1.3检查特定值是否包含在列表中(in、not in)

5.2 if 语句

5.2.1 简单的 if 语句 / if-else 语句 / if-else if-else 语句

 5.2.2 确定列表不是空的 ( if )

 6字典

6.1 字典使用 / 访问字典中的值

6.1.1 创建空字典 / 字典中添加键值对 / 修改字典中的值

6.1.2删除键值对( del )

6.2遍历字典

6.2.1 遍历所有的键值对(items)

6.2.2遍历字典中的所有键(keys)/ 判断某键是否在字典中 (in / not in)

6.2.3按顺序遍历字典中的所有键(sorted)

 6.2.4遍历字典中的所有值(values)/ 并剔除重复项 (set)

6.3嵌套

6.3.1字典列表(类似vector>)

6.3.2 在字典中嵌套列表(类似map>) ,vector

6.3.3在字典中嵌套字典(类似map>) ,map

6.4关于列表,元组,字典总结([]、()、{})

7用户输入和while循环

7.1用户输入

7.1.1 输入函数(input)

7.1.2 数字字符串转换数字函数(int)

 7.1.3 求模运算符(%)

7.2while循环简介

7.2.1while使用 / break / continue

 7.3使用while循环处理列表和字典

7.3.1在列表间移动元素

7.3.2删除包含特定值的所有列表元素 (remove)

8函数

8.1定义函数

8.1.1向函数传递参数(形参、实参)

 8.2传递实参

8.2.1位置实参

8.2.2关键字实参

8.3返回值 

8.3.1返回简单值

8.3.2返回字典

8.4传递列表

8.4.1向函数中传递列表

8.4.2在函数中修改列表

8.4.3避免在函数中修改列表 ( 利用切片 )

8.5传递任意数量的实参

8.5.1结合使用位置实参和任意数量实参

8.5.2使用任意数量的关键字实参

 8.6将函数存储在模块中

8.6.1 导入整个模块( import )

 8.6.2 导入特定的函数( from XX import XX)

 8.6.3 使用as给函数指定别名/ 使用as给模块指定别名

 8.6.4 导入模块中的所有函数

9类 

9.1创建使用类

9.1.1创建dog类 (init,self)

9.1.2 根据类创建实例 (句点表示法——访问属性/调用方法)

9.1.3 给属性指定默认值 

 9.1.4 修改属性的值 ( 直接/方法/通过方法对属性值递增)

 9.2继承

9.3.1子类的方法_init_()

9.3.2给子类定义属性和方法

9.3.3重写父类的方法 

9.4导入类

9.4.1导入单个类


1.python安装(略)

 2.变量和简单数据类型

2.2变量

message="hello python world !"
print(message)

# 不用;不用声明变量类型

2.2.1 变量命名规则:

(1)只能包含字母、下划线、数字。开头必须是字母或者下划线

(2)变量名不能有空格

(3)python关键字不能做函数名或变量名

(4)慎用小写字母l和o容易看成数字1和0,变量名应简短明确

2.2.2使用变量名时避免命名错误

NameError : name  'message'  is  not  defined 原因:

(1)使用变量前完了给它赋值

(2)输入变量名拼写不正确

注:python不会对代码做拼写检查,但要求变量名的拼写一致

2.3字符串

定义:字符串就是一系列字符。python可以用单引号也可以双引号

'hello'
"hello"
#优势
'hello "world"'
"hello 'world'"

#优势:可以在字符中用单或双引号

 2.3.1 将串中字母大小写(title、upper、lower)

title 将串中每个单词首字母大写

upper将串中每个字母大写

lower将串中每个字母小写 

调用: string.title()    string.upper()    string.lower() 

2.3.2 拼接字符串,用+号

2.3.4 删除空白符(rstrip、lstrip、strip)

rstrip() 确保字符串末尾没有空白符

lstrip() 确保字符串开头没有空白符

strip() 确保字符串两端没有空白符

language=' python '
language.lstrip()
language.rstrip()
language.strip()

#注意调用该函数返回值是修改后的串类型,language本身还是' python ',前后均有空白符

2.3.5 python2和python3的print

 注意python3的print是函数,因此括号不可缺少 如:print(message)

2.4数字

2.4.1整数

(1)支持 + - * / 运算

(2)**代表乘方运算

>>> 3**3

27

 

2.4.2浮点数 

>>> 0.1+0.2

0.3

//结果包含的小数位数可能是不确定的,所有语言均有这个问题

>>>0.1+0.2  

0.30000000000000004

 

2.4.3 字符串转换函数 (str)

将非字符串值转换为字符串 如 (int )num=23   str(num) 转成"23"

2.4.4 python整数取整,保留小数用浮点数

整数计算中,取整,小数删除

想保留小数,用浮点数计算

>>>3/2
1
>>>3.0/2
1.5
>>>3/2.0
1.5
>>>3.0/2.0
1.5

 

2.5 python注释用# 

3列表简介

3.1列表是什么

个人感觉就是一个vector+栈 两个功能的集合体

bicycles=['trek','cannondale','specialized']
print(bicycles)
#/结果显示
['trek','cannondale','specialized']

列表定义:列表由一系列按特定顺序排列的元素组成。python中用 [  ] 表示

3.1.1 列表访问元素(依靠下标) 

print(bicycles[0])

结果显示:trek,不带 [  ] 与 '  '

3.1.2 列表索引从0开始而不是1

3.1.2 列表索引特殊语法(负数下标)

bicycles=['trek','cannondale','specialized']
print(bicycles[-1])

特殊语法:-1,python返回最后一个列表元素,-2返回倒数第二个列表元素,依次类推

3.1.3 通过索引使用列表各个值

bicycles[0]
bicycles[1]

可以像使用其他变量一样使用列表的各个值

3.2 列表修改、添加和删除元素 

创建的大多数列表都是动态的

3.2.1 修改列表元素(利用索引)

bicycles[0]='ducati'

修改列表元素的语法与访问列表元素的语法类似

3.2.2 在列表中添加元素(append、insert)

bicycles=['trek','cannondale','specialized']
bicycles.append('ducati')

append函数将元素添加到了列表末尾

bicycles.insert(1,'cucati')

insert可在列表的任何位置添加新元素,指明索引和值。且插入处后面的每个元素都要右移一个位置!

 3.2.3 从列表中删除元素(del、pop、remove)

bicycles=['trek','cannondale','specialized']
del bicycles[1] # cannondale被移除

1.使用del需要知道删除的元素在列表中的位置

>>>bicycles=['trek','cannondale','specialized']
>>>pop_bicycle=bicycles.pop() 
>>>pop_bicycle       #此时pop_bicycle值为specialized
specialized

2.使用pop,列表就像栈,列表的最后一个元素就是栈顶元素

bicycles=['trek','cannondale','specialized']
pop_bicycle=bicycles.pop(2) #此时 pop_bicycle值为cannondale

3.其实pop可以pop任何位置的元素,只需要指定索引位置。这和栈又有点区别

bicycles.remove('ducati')

4.remove 是不知道删除值在列表中的位置使用,且此函数只删除第一个值,也就是说若要删除所有值为‘ducati’应配合循环

总结:

del和pop的区别:看是否需要继续用删除值,不需要就del,需要就pop

remove和del、pop的区别:看是否知道删除值的位置,知道del、pop,不知道remove

书中的一个解释

书中说:remove删除后也可以继续使用 ???WTF???


bicycles=['trek','ducati','cannondale','specialized']
expensive='ducati'
bicycles.remove('ducati')
print(bicycles)  #里面没了ducati
print('可以使用变量'+ expensive +'看到了吗?') #ducati变量可以继续使用

搞不懂好吧,你不对劲!我是傻子还是作者是傻子,expensive和bicycle有关系吗?鸟的关系啊

 3.3组织列表

创建列表,元素的排列顺序常常无法预测

3.3.1 列表排序(sort、sorted)

bicycles=['audi','ducati','cannondale','specialized']
bicycles.sort()
# bicycles结果:['audi','cannondale','ducati','specialized']
bicycles.sort(reverse=True)
# bicycles结果:['specialized','ducati','cannondale','audi']

sort是字母性质永久性排序,即按照字母顺序排序,且对列表会产生修改。

字母逆序,参数传入reverse=True

备注:仅针对小写字母,大写字母需要指定排列顺序

bicycles=['audi','ducati','cannondale','specialized']
print(sorted(bicycles))
# bicycles结果:['audi','ducati','cannondale','specialized']
# 输出结果:['audi','cannondale','ducati','specialized']

sorted临时排序,列表还是保留原来的顺序

总结:sort对列表永久排序,sorted对列表临时排序

3.3.3 逆序列表(reverse) 

bicycles=['audi','ducati','cannondale','specialized']
bicycles.reverse()

reverse永久性修改列表的排列顺序

3.3.4  列表长度(len)

bicycles=['audi','ducati','cannondale','specialized']
len(bicycles) #  4

python 计算长度从1开始

 3.4 列表索引错误总结

1.索引越界 IndexError :list index out of  range

2.访问最后列表元素使用索引-1,任何情况下都有效,即便其长度发生变化

    当且仅当列表为空,此访问方式出错

4.操作列表 

4.1遍历列表

bicycles=['audi','ducati','cannondale','specialized']
for  bicycle  in bicycles:
    print(bicycle)

解释:for循环,从bicycles中取出一个值,存入bicycle,然后打印

4.1.1 深入研究循环(缩进内为一个块) 

for  bicycle  in bicycles:

1.首先对列表的每个元素都执行循环指定步骤,若列表有一百万元素,则执行一百万次

bicycles=['audi','ducati','cannondale','specialized']
for  bicycle  in bicycles:
    print("hello")
    print(bicycle.title()) # Audi
    print(bicycle.upper()) # AUDI
print("This is End"+bicycle.upper())  #SPECIALIZED

2.缩进内为同一块,执行循环N次,未缩进为另一块区,只执行一次

4.2避免缩进错误 

4.2.1 忘记缩进 / 不必要的缩进 / 循环后不必要的缩进

1.IndentationError:expected an indented block

2.产生逻辑错误    //忘记缩进

1.IndentationError:unexpected indent    //不必要的缩进

1.逻辑错误      //循环后不必要的缩进

4.2.2 遗忘了冒号(:)

导致语法错误,且难以发现

4.3创建数值列表

4.31 生成一系列的数字(range)

for value in range(1,5):
    print(value)
#其中range可以指定步长
for value in range(1,10,2):  #步长2
#结果1 3 5 7 9
#打印结果
1
2
3
4

#结果不会打印5

4.3.2用range创建列表(list、range)

numbers=list(range(1,6))
print(numbers)
#结果如下
[1,2,3,4,5]

用list()将range()的结果直接转换成列表

4.3.3对数字执行简单统计(max、min、sum)

>>>digits=[1,2,3,4,5,6,7,8,9,0]
>>min(digits)
0
>>>max(digits)
9
>>>sum(digits)
45

简单的函数调用演示

4.3.4列表解析(一行代码生成列表)

squares = [value**2 for value in range(1,11)]
print(squares)
#结果如下
[1,4,9,16,25,36,49,64,81,100]

value**2 代表平方

4.4使用部分列表

处理列表的部分元素——python称为切片

4.4.1切片

bicycles=['trek','cannondale','specialized','michael','eli']
print(bicycles[0:3])
#结果如下
['trek','cannondale','specialized','michael']

eli没有被输出,重要一点在于切片是原bicycles的一个副本copy

切片的4种表达方式

1.bicycles[0:3]    提取下标0-3元素

2.bicycles[:3]     提取下标从起始点0-3的元素

3.bicycles[2:]     提取下标从2-末尾的元素

4bicycles[-3:]     提取下标最后3个元素 

最后一种需要重点了解

4.4.2遍历切片

4.4.3复制列表

复制列表可以创建一个整个列表的切片

bicycles=['trek','cannondale','specialized','michael','eli']
bicycles_too=bicycles[:]    #起始点到终止点

备注:对bicycles_too的修改不会影响bicycles,同样对bicycles修改也不会影响bicycles_too,故这是一个副本拷贝,而不是一个关联

bicycles_too=bicycles

#这是关联,可以看成引用,修改任意一个,另一个收到影响

4.5元组

不能修改的值称为不可变的,而列表可以修改,为了满足列表中值不能修改需要,创造出了元组。

简单来说元组就是一个列表,但是其中的值不可以修改

4.5.1定义元组

元组跟列表的不同之处在于,使用圆括号而不是方括号来标识

#列表
dimensions_too=[1,4,3,5,6]
#元组
dimensions=(1,4,3,5,6)
#使用依旧同列表,利用下标
print(dimensions[0])

当尝试修改元组的元素时

>>>dimensions[0]=2
TypeError: 'tuple' object not support item assignment

显示出错,不允许修改

4.5.3修改元组变量

 虽然不能修改元组的元素,但竟然可以给存储元组的变量赋值

dimensions=(1,4,3,5,6)
#修改元素,错误
dimensions[0]=10
#给变量赋值,正确
dimensions=(3,4,5)

变量赋值合法,修改元素非法,好家伙,房子不给人装修,竟然可以拆了重盖

5 if 语句

if 语句的核心 就是True 或者 False的表达式,这种表达式称为条件测试

5.1 条件测试

5.1.1 检查字母考虑大小写,数字比较

python中 if 语句检查区分字母大小写

布尔表达式要么 True 要么 False 

>>> age = 10
>>> age < 21
True
>>> age <= 21
True
>>> age > 21
False
>>> age >=21
False

#支持数学符号 =、!=、>、<、<=、>= 

5.1.2 检查多个条件(and、or)

>>>A and B  # AB均为true才true,否则false
False
>>>A or B   # AB有一个为true则为true
True

逻辑运算

5.1.3检查特定值是否包含在列表中(in、not in)

>>>bicycles=['trek','cannondale','specialized','michael','eli']
>>>'trek' in bicycles
True
>>>'eell' in bicycles
False
bicycles=['trek','cannondale','specialized','michael','eli']
bicycle='TREKL'
if bicycle in bicycles
    print("IN")
if bicycle not in bicycles
    print("NOT IN")

# in 和 not in 两种写法

5.2 if 语句

5.2.1 简单的 if 语句 / if-else 语句 / if-else if-else 语句

切记冒号 : 

age=19
if age>18 :
    print("Older")

#简单的 if 语句

age=19
if age>18 :
    print("Older")
else  :
    print("Younger")

# if-else 语句

age=19
if age<18 :
    print("Children")
else if age<30 :
    print("Younger")
else :
    print("Older")

# if - else if -else

# 多个else if

# 省略else

 5.2.2 确定列表不是空的 ( if )

numbers=[]
if numbers :
    print("empty")

# 直接名称判断

 6字典

字典是一系列的 键-值 对,每个键都和一个值相关联。——其实也就相当于C++ map<key,value>,但由又有点区别

6.1 字典使用 / 访问字典中的值

 区别 :C++ map<string,string>m 确实可以存color:green 但是points:5(map<string,int>)二者混合了

alien_0={'color':'grenn','points':5}     #使用字典
print(alien_0['color'])    #访问字典
print(alien_0['points'])
#输出结果
green
5

# 要获取与键相关联的值,可依次指定字典名和放在方括号内的键,如print(alien_0['color'])

6.1.1 创建空字典 / 字典中添加键值对 / 修改字典中的值

字典是一种动态结构,可随时添加键值对,也可随意修改

alien_1={} #初始化空字典
alien_0={'color':'grenn','points':5}     #初始化
alien_0['x_point']=0     #动态添加
alien_0['x_point']=25    #修改键值对中的值

 

6.1.2删除键值对( del )

alien_0={'color':'grenn','points':5}  
print(alien_0)
del alien_0['points']
print(alien_0)
#结果如下
{'color':'grenn','points':5}  
{'color':'grenn'}

对于字典中不在需要的信息,使用 del 语句将相应键值对彻底删除

6.2遍历字典

6.2.1 遍历所有的键值对(items)

alien_0={'color':'grenn','points':5} 
for  key,value  in  alien_0.items()
    print('Key'+key)
    print('value'+value)

注意:即便遍历字典时,键值对的返回顺序也与存储顺序不同,python不关心键值对的存储顺序,而只追踪键值之间的关联关系

6.2.2遍历字典中的所有键(keys)/ 判断某键是否在字典中 (in / not in)

alien_0={'color':'grenn','points':5} 
for  key in  alien_0.keys()
    print(key.title())
for  key in  alien_0    #二者等价
     print(key.title())

在不需要使用字典中的值时,方法keys()很有用

遍历字典时,会默认遍历所有的键,因此上述代码中的二者等价,输出不变

if 'erin' in  alien_0.key()    #在
    print('Y')
if 'erin' not in alien_0.key()    #不在
    print('N')

事实上,key返回的是一个列表,其中包含了字典中的所有键

6.2.3按顺序遍历字典中的所有键(sorted)

字典记录键和值之间的关联关系,但获取字典元素时,获取顺序是不可预测的。

以特定的顺序返回元素,在for循环中对返回的键进行排序

for name in sorted(alien_0.key())
    print(name)

思想:在遍历前对key列表进行排序

 6.2.4遍历字典中的所有值(values)/ 并剔除重复项 (set)

for value in alien_0.values()
    print(value)

values返回一个值列表,而不包含任何键

缺点:值可以重复,因此提取的值未剔除重复项

for value  in set(elien_0.values())
    print(value)

解决方案:set中每个元素必须独一无二,因此对包含所有值元素的列表调用set

6.3嵌套

 将一系列字典存储在列表中,或将列表作为值存储在字典中,称为嵌套

6.3.1字典列表(类似vector<map<string,string>>)

alien_0={'color':'grenn','points':5}  
alien_1={'color':'red','points':4}  
alien_2={'color':'yellow','points':3}  
aliens=[alien_0,alien_1,alien_2]

将字典都放到一个名为aliens的列表中

6.3.2 在字典中嵌套列表(类似map<string,vector<string>>) 

pizza-{
    'crust':'thick',
    'toppings':['mushrooms','extra cheesse']
}

每当需要字典中将一个键关联到多个值时,都可以在字典中嵌套一个列表

6.3.3在字典中嵌套字典(类似map<string,map<string,string>>) 

users={
    '张三':{    
         '原来住':'江苏省某市'   
         '现在住':'山东省某市'
    },
    '李四':{
         '原来住':'陕西省某市'   
         '现在住':'山西省某市'
    }
}

张三类似第一个string,(原来住,现在住)对应map<string,string>里面的元素

6.4关于列表,元组,字典总结([]、()、{})

[  ] 列表

(  ) 元组

{  } 字典

7用户输入和while循环

7.1用户输入

函数input()让程序暂停运行,等待用户输入一些文本。获取用户输入后,python将其存储在一个变量中,以供使用

7.1.1 输入函数(input)

>>>age=input("How old are you ?")
How old are you ? 21
>>>age
21

使用input输入,python解读为字符串,参数为提示符

7.1.2 数字字符串转换数字函数(int)

>>>age=input("How old are you ?")
How old are you ? 21
>>>age=int(age)
>>>age>18
True

若不int转换,直接比较会出错

TypeError:unorderable types:str()>=int()

 

 7.1.3 求模运算符(%)

7.2while循环简介

7.2.1while使用 / break / continue

i=1
while i<5 :
    print(i)
    i+=1

break终止循环,continue终止本次循环,进入下一次循环

循环必须有停止的途径,防止无限循环

 7.3使用while循环处理列表和字典

for循环中不能修改列表,否则导致python难以跟踪其中元素,若在遍历的同时对其修改,可使用while

7.3.1在列表间移动元素

confirmed_users=[]
unconfirmed_users=['a','b','c']
while unconfirmed_users :
    current_user=unconfirmed_users.pop()
    print(current_user)
    confirmed_users.append(current_user)

#结果遍历检查元素,unconfirmed_users变成空表

缺点:做个检查修改了原来的unconfirmed_users 列表,因此可以通过副本来做 unconfirmed_users_too=unconfirmed_users[ : ]

7.3.2删除包含特定值的所有列表元素 (remove)

users=['b','a','b','c','b']
while 'b' in users:
    users.remove('b')

通过while检查,remove移除实现

8函数

8.1定义函数

def user():
    """ 文档字符串,描述函数功能 """
    print('hello')

user()

 user 函数名,冒号后面为函数体, 三个双引号"""部分为文档字符串,user()为函数调用

8.1.1向函数传递参数(形参、实参)

def user(username='Admin'): 
    """ 显示问候 """
    print('hello '+username)
user()           # hello Admin
user('jake')     # hello jake

username 形参 ,函数调用时候输入的'jake'实参 ,其中形参给了默认值

 8.2传递实参

函数传递实参方式很多

          位置实参:要求实参顺序与形参顺序相同

         关键字实参:每个实参都有变量名和值组成

         使用列表和字典等

8.2.1位置实参

def login(username,userpassword):
    """登录密码检查"""
    if username=='Admin' and userpassword=='123'
        print('True')
    else
        print('False')
login('admin','123') # 实参顺序和形参顺序一致

python函数调用每个实参都关联到函数定义中的一个形参,此关联方式基于实参的顺序,故被称为位置实参

8.2.2关键字实参

def login(username,userpassword):
    """登录密码检查"""
    if username=='Admin' and userpassword=='123'
        print('True')
    else
        print('False')
login(username='admin',userpassword='123') # 准确指定函数定义中的形参名

关键字实参是传递给函数的名称-值对,直接在实参中将名称和值关联起来了

8.3返回值 

函数返回的值被称为返回值

8.3.1返回简单值

def Hi(first_name,last_name) :
    """返回整洁的名字"""
    full_name=first_name+' '+last_name
    return full_name     #返回值

 

8.3.2返回字典

def build_person(first_name,last_name):
    """存储名字"""
    person={'first':first_name,'last':last_name}
    return person    #返回字典

#函数可返回任何类型的值,包括列表和字典等较复杂的数据结构

8.4传递列表

8.4.1向函数中传递列表

def greet_users(names):
    """输出列表中的名字"""
    for name in names:
        print(name)

#向函数中传递列表很有用

8.4.2在函数中修改列表

check_names={}
uncheck_names={'aa','bb','cc'}
def print_model(check_names,uncheck_names):
    """检查名字输出"""
    current_name=uncheck_names.pop()
    print(current_name)
    check_names.append(current_name)
print_model(check_names,uncheck_names)

缺点:检查名字的模块竟然修改了传递的数据集check_names和uncheck_names

8.4.3避免在函数中修改列表 ( 利用切片 )

check_names={}
uncheck_names={'aa','bb','cc'}
def print_model(check_names,uncheck_names):
    """检查名字输出"""
    current_name=uncheck_names.pop()
    print(current_name)
    check_names.append(current_name)
print_model(check_names,uncheck_names[:]) #切片

解决方案:向函数传递列表的副本而不是原件,这样函数的任何修改都只影响副本,不影响原件。 (切片表示法 [ : ] 创建列表的副本) 

8.5传递任意数量的实参

形参*argv,不管调用语句提供多少个实参,这个形参都接受。

其实*argv中的*是创建了一个名为argv的空元组,并将所接收到的参数都放入元组内

def make_pizza(*toppings):
    """打印顾客配料"""
    print(toppings)
make_pizza('pepperoni')
make_pizza('pepperoni','green peppers','extra cheese')

# 一个参数和多个参数均可以传

8.5.1结合使用位置实参和任意数量实参

def make_pizza(size,*toppings):
    """打印顾客配料"""
    print(size+'配料:'+toppings)
make_pizza(12,'pepperoni')
make_pizza(16,'pepperoni','green peppers','extra cheese')

注意:如果想让函数接收不同类型的实参,必须在函数定义中将接纳任意数量实参的形参放在最后

8.5.2使用任意数量的关键字实参

 

def build_profile(first,last,**user_info):
    """创建一个字典,其中包含我们知道的有关用户的一切"""
    profile={}
    profile['first_name']=first
    profile['last_name']=last
    for key,value in user_info.items():
        profile[key]=value
    return profile
use_profile=build_profile('alber','einstein',location='princeton',field='physics')
print(use_profile)
        

形参**user_info的**是让python创建一个名为user_info的字典,并将收到的所有名称-值对都封装到字典中

 8.6将函数存储在模块中

将函数存储在被称为模块的独立文件中,再利用import将模块导入主程序中

8.6.1 导入整个模块( import )

import make_pizza

创建模块,只让.py的文件中含有make_pizza

 8.6.2 导入特定的函数( from XX import XX)

from model_name import function_name

从模块中导入函数

 8.6.3 使用as给函数指定别名/ 使用as给模块指定别名

from pizza import make_pizza as mp

import pizza as p

取别名,避免导入的函数名称与程序中现有的名称冲突。或者名称太长,指定简短而独一无二的别名

 8.6.4 导入模块中的所有函数

from pizza import *

注意:(1)* 号运算符可让python导入模块中的所有函数

           (2)并非自己编写的大型模块,最好不要采用 这种导入方法

                        原因:a. 模块中的函数名称可能与自己项目中使用名称相同冲突

                                   b.python遇到多个名称相同的函数或变量,进而覆盖函数,而不是分别导入

建议:要么只导入需要使用的函数,要么导入整个模块并使用句点表示法

9类 

9.1创建使用类

9.1.1创建dog类 (init,self)

class dog():
    """模拟小狗"""
    def _init_(self,age):
        """初始化属性"""
        self.name=name
        self.age=age
    def sit(self):
        """模拟小狗蹲下"""
        print(self.name.title()+'is now sitting')
    def roll_over(self):
        """模拟小狗打滚"""
        print(self.name.title()+'rolled over !')

1. 方法_init_( ):类中的函数称为方法,此方法每当dog类创建新实例时,python会自动运行 ( 类似构造函数 )

2. self : self必不可少,还必须位于其他形参前面,它是一个指向实例本身的引用

9.1.2 根据类创建实例 (句点表示法——访问属性/调用方法)

my_dog=dog('willie',6)
print('dog age is'+ str( my_dog.age )+'years old')

1.访问属性:句点表示法 my_dog.age

2.调用方法:句点表示法  my_dog.sit ( )

9.1.3 给属性指定默认值 

class Car():
    def _init_(self,make,model,year):
        """初始化描述汽车的属性"""
        self.make=make
        self.model=model
        self.year=year
        self.odometer_reading=0    #给属性指定默认值
    def get_descriptive_name(self):
        --snip--

类中每个属性都必须要有初始值,哪怕这个值是0或者空字符串,设置默认值在_init_内指定是可行的

 9.1.4 修改属性的值 ( 直接/方法/通过方法对属性值递增)

1.直接修改属性的值

my_car.odometer_reading=23

2.通过方法修改属性的值

def update_odometer(self,mileage):
    """将里程表读数设置为指定的值"""
    self.odometer_raading=mileage

3.通过方法对属性的值递增

def update_odometer(self,mileage):
    """将里程表读数设置为指定的值"""
    self.odometer_raading += mileage    #递增

 

 9.2继承

编写 的类是另一个现成类的特殊版本,可使用继承.

一个类继承另一个类时,原有的类称为父类,而新类称为子类。子类继承其父类的所有属性和方法,同时还可以定义自己的属性和 方法

9.3.1子类的方法_init_()

创建子类的实例时,python需要给父类的所有属性赋值,因此子类的方法_init_()需要父类——super实现

class Car():
    """模拟汽车的简单尝试"""
    def _init_(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_raading=0
    def get_descriptive_name(self):
        --snip--
    def update_odometer(self,mileage):
        --snip--

class ElectricCar(Car):
    """电动车独特之处"""
    def _init_(self,make,model,year):
        """初始化父类的属性"""
        super._init_(make,model,year)    #super方法实现

my_tesla=ElectricCar('tesla','model s','2016')
    

#子类的方法_init_()需要给父类的所有属性赋值父类——super实现

9.3.2给子类定义属性和方法

import Car

class ElectricCar(Car):
    """电动车独特之处"""
    def _init_(self,make,model,year):
        """初始化父类的属性"""
        super._init_(make,model,year)    #super方法实现
        self.battery_size=70

    def describe_battery(self):
        """打印一条描述电瓶容量的消息"""
        print(str(self.battery_size))

#属性定义在_init_中,方法直接写在类中

9.3.3重写父类的方法 

对于父类的方法,只要它不符合子类模拟实物的行为,都可以对其进行重写,在子类中定义一个方法,与父类的方法同名。python将不会考虑这个父类方法,而只关注你在子类定义的相应方法

注意:使用继承时,可让子类保留从父类哪里继承而来的精华,剔除糟粕

9.4导入类

python允许你将类存储在模块中,然后在主程序中导入所需的模块

9.4.1导入单个类

from car import Car    #导入单类

from car import Car,ElectricCar     #导入多类

# 解释从car.py模块中导入Car类 

解释:(1)导入类是一种有效的编程方式。

           (2)主程序文件变得简洁,程序员可以专注与主程序的高级逻辑部分

"""一个可用于表示汽车的类"""    

class Car():
    """模拟汽车的简单尝试"""
    def _init_(self,make,model,year):
        self.make=make
        self.model=model
        self.year=year
        self.odometer_raading=0
    def get_descriptive_name(self):
        --snip--
    def update_odometer(self,mileage):
        --snip--

class ElectricCar(Car):
    """电动车独特之处"""
    def _init_(self,make,model,year):
        """初始化父类的属性"""
        super._init_(make,model,year)    #super方法实现

注意:(1)应该为每一个创建的模块都编写文档字符串。如本类中的"""一个可用于表示汽车的类"""    

           (2)同一个模块中的类应存在某种关系,但是可根据需要在一个模块中存储任意数量的类

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值