ex37 symbol review 续
data type
函数isinstance()
或者 type()
可以获取变量类别。
- True/False
- None
Assigning a value of None to a variable is one way to reset it to its original, empty state.
python - What is a None value? - Stack Overflow
所有的变量的初始状态都是none,如字面意思,无。当我们定义一个变量,比如 aa= “hello world”
, 我们做的是填上aa变量的空白,给他一个值“ hello world”。
按照经典比喻,所有变量的名字如同标签,可以贴下撕掉换地方。那么这一步也可以说,aa 这个标签 曾经贴在了 none 的地方,现在我们用 aa= “hello world”
这句命令,让 aa 这个标签 贴到了 “hello world”这个地方。
- Strings
- Numbers
int:整数,integer
float:浮点数
complex:复数 - sequence
lists:有序清单,从0开始,可更改,(element1,element2,.. )
tuples:有序清单,从0开始,不可更改,[element1, element2,... ]
dictionary:无序清单,可更改,{key1:value1, key2:value2,...}
string escape sequence
复习符号 | Learn Python the Hard Way 中文版
- bell的意思,即 响铃。 输出
\a
时,电脑会发出响声~ - 退格,即删除前一个。
- formfeed,carriage return的理论效果https://stackoverflow.com/a/35375158/9313875如下:
printf("stackoverflow\rnine")
ninekoverflow
printf("stackoverflow\fnine\fgreat")
stackoverflow
nine
great
参考:newline - What are carriage return, linefeed, and form feed? - Stack Overflow
但由于三大系统中的回车与换行默认设置不一样,见回车和换行 - 阮一峰的网络日志,于是我的windows系统下,效果跟理论不一样。。
垂直的tab,在我电脑里显示是这样
carriage, 暂时理解为定义此处为句首,于是之前的都不显示了,效果如图
string formats & operations
比较简单,详见
复习符号 | Learn Python the Hard Way 中文版
-
关于dot,这篇写的超级可爱。1. The dot notation — Object-Oriented Programming in Python
简单来说,这个dot,就是用于连接 以下 的符号- object和其method
- object 和其attribute
比如之前在ex15学过的file object。它有各种method,如read,write,truncate等等,连接方式正是用dot,写作
fileobject.write()
@ class method,先认识这是用于提示class method,后续再看!
ex38 list method + OOP
先复习list相关,ex32,在05笨方法学Python|ex27-ex34 - 简书。
split
split里的两个引号(单引号,双引号都可以)之间要加空格;method的解读
mystuff.append("hello")
等同于append (mystuff, "hello")
' '.join(things)
等同于join(' ', things)
,解读为 Join things with ‘ ‘ between them.区分attribute,method,object,class的概念
这里的解释真是通俗易懂啊~ Python 101: Object Oriented Programming part 1 – The Renaissance Developer – Medium
object
可以类比成我们真实世界里的各种object,比如车,狗,蛋糕等等;
每个object
都会有两个主要特点:数据 data 和 行为 behavior。比如一辆车,它的数据是车长,车高,耗油量等等;它的行为有 启动,加速,倒车,停止等等。
在python的世界里,我们把 数据 叫做attribute
,把行为 叫做method
.
所有的车基本都是四个轮子,有引擎,有车盖等等,这都来源于同样的 原型prototype,model模型或者blueprint蓝图,这个原型模板就是class
. 在class里我们定义其中的object应该有哪些数据和哪些行为。-
OOP,object-oriented programming是什么?
一种程序设计方法,框架。
以下学自维基百科 面向对象程序设计
程序有两种设计方法:- procedeure-oriented programming 或者叫 functional programming,围绕函数构建,即给电脑一个一个的指令去做;
- object-oriented programming,OOP,面向对象编程,围绕object构建。各个objects互相独立,又可各自调用。每个object 可以输入,处理,输出。
-
为什么说OOP好呢?
它有四大特点:- Encapsulation可封装:传递更快,保护代码
- Data Abstraction抽象:去掉细节,简化问题
- Polymorphism多态:衍生广
- Inheritance 可继承:代码可重复利用
OOP初窥
Object Oriented Programming · A Byte of Python
Python 101: Object Oriented Programming part 1 – The Renaissance Developer – Medium
Python Tutorial: Object Oriented Programming
变量self
:约定俗成这就是用作object的变量。
方法_int_
,开始一个新的object,第一个就要用它。
装饰符@classmethod
,提供快捷键
class Person:
def __init__(self, name):
self.name = name
def say_hi(self):
print('Hello, my name is', self.name)
p = Person('Swaroop')
p.say_hi()
# The previous 2 lines can also be written as
# Person().say_hi()
- What’s the relationship between dir(something) and the “class” of something?
dir(something)
会列举出这个object对象的所有attributes.而‘class’ of sth就是指这个对象的type 类别。
>> a = 1
>>> dir(a)
['__abs__', '__add__', '__and__', '__class__', '__cmp__', '__coerce__', '__delattr__', '__div__', '__divmod__', '__doc__', '__float__', '__floordiv__', '__format__', '__getattribute__', '__getnewargs__', '__hash__', '__hex__', '__index__', '__init__', '__int__', '__invert__', '__long__', '__lshift__', '__mod__', '__mul__', '__neg__', '__new__', '__nonzero__', '__oct__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdiv__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real']
>>> type(a)
<type 'int'>
>>>
上面这个例子来自In Python, what’s the relationship between dir (something) and the “class” of something? - Quora
ex39 dicts
dict 是无序的 数组。
ordereddict 有序的数组,见OrderedDict - Python Module of the Week
ex39_test hashmap
在线中文版字典,可爱的字典 | Learn Python the Hard Way 中文版比我手头的英文版多出来一大段代码,叫做hashmap,有难度,待研究。
ex40
已经知道oop大概是什么了,看到shawn的讲解,很是佩服能把事情说得这么清楚。喜欢他把dict,module,class放一起比较,很有启发。
字典,模块,类,都可以实现“get sth from sth”:
# dict style
mystuff['apples']
# module style
mystuff.apples()
print mystuff.tangerine
# class style
thing = MyStuff()
thing.apples()
print thing.tangerine
从这种对比,可以看到,class比module更棒的地方,就在于module只能用一次,而class可以想用几次用几次,这里叫thing,下次加name,无限次使用。
一个错误总结
TypeError: object() takes no parameters when creating an object
原因是:__init__
,注意这里是左右各两个下划线
ex41
string method
关于string字符串,有许多method行为,可见 5.6.1 string method — Python 2.7.14 documentationstring.strip([chars])
:作用是“脱掉”指定的字符chars。如果不指定字符,即string.strip(),那么默认去掉原字符串前后的空格。
比如
string = ' xoxo love xoxo '
# Leading whitepsace are removed
print(string.strip())
print(string.strip(' xoxoe'))
# Argument doesn't contain space
# No characters are removed.
print(string.strip('sti'))
string = 'android is awesome'
print(string.strip('an'))
结果是
xoxo love xoxo
lov
xoxo love xoxo
droid is awesome
- string.capitalize()
作用是将字符串的首字母大写。如果字符串的第一个字符不是字母,那什么也不会被改变。 - string.count
官方教程里写作str.count(sub[, start[, end]])
,等同于string.count(substring, start=..., end=...)
,这样写法的意思是:start部分和end部分都是可写可不写的。
这个method的作用是:返回某个substring在string里的出现次数。
所以练习中snippet.count("%%%")
=%%%
在snippe
t出现的次数。 - random模块
这个模块很有意思,在给定的范围里生成随机(random)的元素~
这节练习里出现过的有:
random.randint(a,b)
: 返回一个[a,b]之间的整数,包括a和b;
random.sample(population,k)
:返回一个population序列的子序列,长度为k.
random.shuffle(x[, random])
: 将list x 中的元素打乱顺序重排,即“洗牌”。注意它的说明:shuffle list x in place; return None.来自python - Shuffling a list of objects - Stack Overflow
参考:9.6. random — Generate pseudo-random numbers — Python 2.7.14 documentation - result = sentence[:]
这句的作用是 复制sentence这个列表给result.
冒号表示python中的切片功能,可以参考How to Slice Lists/Arrays and Tuples in Python | Python Central -
question,answer = convert(snippet,phrase)
这句话我想了很久,后来看到https://stackoverflow.com/a/23727814/9313875 这个答案,明白了。-
for sentence in snippet,phrase
:这句话其实包含了两个循环,因为snippet和phrase是两个不同的列表,因此会分别进行循环。 - results是什么?一个list,包含两个字符串
- list的一种读取方法是这样的:对于包含N个元素的list,可以用
a1,a2,a3,...aN = list
来读取
-
>>> list = [1,2,3,4]
>>> a,b,c,d = list
>>> print a
1
>>> print c
3
>>> e,f = list
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: too many values to unpack
#list里一共有4个元素,而e,f才2个变量,调不出来,报错。
- DEBUG帮助理解代码:
DEBUG = 1
if DEBUG:
print "snippet: " , snippet
print "phrase: ", phrase
print "results:",convert(snippet,phrase) #这里不能写print "results:",results. 因为叫results这个名字的变量其实并不存在~
关于退出
在windows 10系统下是ctrl+Z
,而不是作者写的ctrl+D
.理解代码
过了ex40后果然难度加大了不少,哈哈。
书上的代码没有bug,保证单词全部正确输入,便可以正常运行。我曾经因为capitalize这个单词拼错,卡了3天,唉。。
感谢这篇博客,帮我理清了几个重要问题!这次是中文的!Learn Python The Hard Way 习题41详解 - CSDN博客,作者还画了代码的流程图,好办法!画个代码地图,也是shawn非常提倡的学习方法。
ex42
- 为什么要写成class(object)
这样写叫做new style class,用以区分old style class.这是个历史原因,而且只是python2里有这个问题。在python2的发展历史中,关于class的继承性的bug发现得太晚了,于是如果想让我们的child class能顺利继承parent class里的性质,必须要写成class(object),不知道他们为什么一定要选object这个词,换个词就不容易晕了。
anyway,可以把它当成一个固定写法,如此class才能继承object里的所有method。更简单来说,对于我这样的菜鸟,只要初次定义class,就写成这个格式就好了。
详情可参考: - 关于python super()
学习自Python super()
主要功能有两个:
- 可以间接指向父类,即用super(),就不必再明写出父类的类名,很实用;
- 实现多次继承,多个sibling class的时候必备。
这个例子很清楚:
class Animal:
def __init__(self, animalName):
print(animalName, 'is an animal.');
class Mammal(Animal):
def __init__(self, mammalName):
print(mammalName, 'is a warm-blooded animal.')
super().__init__(mammalName)
class NonWingedMammal(Mammal):
def __init__(self, NonWingedMammalName):
print(NonWingedMammalName, "can't fly.")
super().__init__(NonWingedMammalName)
class NonMarineMammal(Mammal):
def __init__(self, NonMarineMammalName):
print(NonMarineMammalName, "can't swim.")
super().__init__(NonMarineMammalName)
class Dog(NonMarineMammal, NonWingedMammal):
def __init__(self):
print('Dog has 4 legs.');
super().__init__('Dog')
d = Dog()
print('')
bat = NonMarineMammal('Bat')