网站性能检测评分
注:本网站页面html检测工具扫描网站中存在的基本问题,仅供参考。
十分钟学会python
python大牛学习笔记十分钟就入门了?! 行业视频课程
人生苦短,我用python
十分钟入门python?
这个笔记可以获取的
还是分享自己的Python学习交流群:643692991,这个笔记可以获取的
群内每天分享干货,包括2017最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流
# 单行注释以井字符开头
""" 我们可以使用三个双引号(")或单引号(')
来编写多行注释
"""
##########################################################
## 1. 基本数据类型和操作符
# 数字
3#=>3
# 你预想的数学运算
1+1#=>2
8-1#=>7
10*2#=>20
35/5#=>7
# 除法略显诡异。整数相除会自动向下取小于结果的最大整数
11/4#=>2
# 还有浮点数和浮点数除法(译注:除数和被除数两者至少一个为浮点数,结果才会是浮点数)
2.0# 这是一个浮点数
5.0/2.0#=> 2.5 额...语法更明确一些
# 使用括号来强制优先级
(1+3)*2#=>8
# 布尔值也是基本类型数据
True
False
# 使用not来求反
notTrue#=>False
notFalse#=>True
# 相等比较使用==
1==1#=>True
2==1#=>False
# 不相等比较使用!=
1!=1#=>False
2!=1#=>True
# 更多的比较方式
1<10#=>True
1>10#=>False
2<=2#=>True
2>=2#=>True
# 比较操作可以串接!
1<2<3#=>True
2<3<2#=>False
# 可以使用"或'创建字符串
"This is a string."
'This is also a string.'
# 字符串也可以相加!
"Hello "+"world!"#=> "Hello world!"
# 字符串可以看作是一个字符列表
"This is a string"[0]#=>'T'
# None是一个对象
None#=>None
####################################################
## 2. 变量与数据容器
# 打印输出非常简单
print"I'm Python. Nice to meet you!"
# 赋值之前不需要声明变量
some_var=5# 约定使用 小写_字母_和_下划线 的命名方式
some_var#=>5
# 访问之前未赋值的变量会产生一个异常
try:
some_other_var
exceptNameError:
print"Raises a name error"
# 赋值时可以使用条件表达式
some_var=aifa>belseb
# 如果a大于b,则将a赋给some_var,
# 否则将b赋给some_var
# 列表用于存储数据序列
li=[]
# 你可以一个预先填充的列表开始
other_li=[4,5,6]
# 使用append将数据添加到列表的末尾
li.append(1)#li现在为[1]
li.append(2)#li现在为[1, 2]
li.append(4)#li现在为[1, 2, 4]
li.append(3)#li现在为[1, 2, 4, 3]
# 使用pop从列表末尾删除数据
li.pop()#=> 3,li现在为[1, 2, 4]
# 把刚刚删除的数据存回来
li.append(3)# 现在li再一次为[1, 2, 4, 3]
# 像访问数组一样访问列表
li[0]#=>1
# 看看最后一个元素
li[-1]#=>3
# 越界访问会产生一个IndexError
li[4]# 抛出一个IndexError异常
exceptIndexError:
print"Raises an IndexError"
# 可以通过分片(slice)语法来查看列表中某个区间的数据
# 以数学角度来说,这是一个闭合/开放区间
li[1:3]#=> [2, 4]
# 省略结束位置
li[2:]#=> [4, 3]
# 省略开始位置
li[:3]#=> [1, 2, 4]
# 使用del从列表中删除任意元素
delli[2]#li现在为[1, 2, 3]
# 列表可以相加
li+other_li#=> [1, 3, 3, 4, 5, 6] - 注意:li和other_li并未改变
# 以extend来连结列表
li.extend(other_li)# 现在li为[1, 2, 3, 4, 5, 6]
# 以in来检测列表中是否存在某元素
1inli#=>True
# 以len函数来检测列表长度
len(li)#=>6
# 元组类似列表,但不可变
tup=(1,2,3)
tup[0]#=>1
tup[0]=3# 抛出一个TypeError异常
exceptTypeError:
print"Tuples cannot be mutated."
# 可以在元组上使用和列表一样的操作
len(tup)#=>3
tup+(4,5,6)#=> (1, 2, 3, 4, 5, 6)
tup[:2]#=> (1, 2)
2intup#=>True
# 可以将元组解包到变量
a,b,c=(1,2,3)# 现在a等于1,b等于2,c等于3
# 如果你省略括号,默认也会创建元组
d,e,f=4,5,6
# 看看两个变量互换值有多简单
e,d=d,e#现在d为5,e为4
# 字典存储映射关系
empty_dict={}
# 这是一个预先填充的字典
filled_dict={"one":1,"two":2,"three":3}
# 以[]语法查找值
filled_dict['one']#=>1
# 以列表形式获取所有的键
filled_dict.keys()#=> ["three", "two", "one"]
# 注意 - 字典键的顺序是不确定的
# 你的结果也许和上面的输出结果并不一致
# 以in来检测字典中是否存在某个键
"one"infilled_dict#=>True
1infilled_dict#=>False
# 试图使用某个不存在的键会抛出一个KeyError异常
filled_dict['four']#=>抛出KeyError异常
# 使用get方法来避免KeyError
filled_dict.get("one")#=>1
filled_dict.get("four")#=>None
# get方法支持一个默认参数,不存在某个键时返回该默认参数值
filled_dict.get("one",4)#=>1
filled_dict.get("four",4)#=>4
# setdefault方法是一种添加新的键-值对到字典的安全方式
filled_dict.setdefault("five",5)#filled_dict["five"]设置为5
filled_dict.setdefault("five",6)#filled_dict["five"]仍为5
# 集合
empty_set=set()
# 以几个值初始化一个集合
filled_set=set([1,2,2,3,4])# filled_set现为set([1, 2, 3, 4, 5])
# 以&执行集合交运算
other_set=set([3,4,5,6])
filled_set&other_set#=> set([3, 4, 5])
# 以|执行集合并运算
filled_set|other_set#=> set([1, 2, 3, 4, 5, 6])
# 以-执行集合差运算
set([1,2,3,4])-set([2,3,5])#=> set([1, 4])
# 以in来检测集合中是否存在某个值
2infilled_set#=>True
10infilled_set#=>False
## 3. 控制流程
# 创建个变量
some_var=5
# 以下是一个if语句。缩进在Python是有重要意义的。
# 打印 "some_var is smaller than 10"
ifsome_var>10:
print"some_var is totally bigger than 10."
elifsome_var<10:
print"some_var is smaller than 10."
else:
print"some_var is indeed 10."
For循环在列表上迭代
输出:
dog is a mammal
cat is a mammal
mouse is a mammal
foranimal in["dog","cat","mouse"]:
# 可以使用%来插补格式化字符串
print"%s is a mammal"%animal
while循环直到未满足某个条件。
0
1
2
3
x=0
whilex<4:
printx
x+=1# x = x + 1的一种简写
# 使用try/except块来处理异常
# 对Python 2.6及以上版本有效
# 使用raise来抛出一个错误
raiseIndexError("This is an index error")
exceptIndexErrorase:
pass# pass就是什么都不干。通常这里用来做一些恢复工作
# 对于Python 2.7及以下版本有效
exceptIndexError,e:# 没有"as",以逗号替代
pass
## 4. 函数
# 使用def来创建新函数
defadd(x,y):
print"x is %s and y is %s"%(x,y)
returnx+y# 以一个return语句来返回值
# 以参数调用函数
add(5,6)#=> 11 并输出 "x is 5 and y is 6"
# 另一种调用函数的方式是关键字参数
add(x=5,y=6)# 关键字参数可以任意顺序输入
# 可定义接受可变数量的位置参数的函数
defvarargs(*args):
returnargs
varargs(1,2,3)#=> (1, 2, 3)
# 也可以定义接受可变数量关键字参数的函数
defkeyword_args(**kwargs):
returnkwargs
# 调用一下该函数看看会发生什么
keyword_args(big="foot",loch="ness")#=> {"big": "foo", "loch": "ness"}
# 也可以一次性接受两种参数
defall_the_args(*args,**kwargs):
printargs
printkwargs
all_the_args(1, 2, a=3, b=4)输出:
[1, 2]
{"a": 3, "b": 4}
# 在调用一个函数时也可以使用*和**
args=(1,2,3,4)
kwargs={"a":3,"b":4}
foo(*args)#等价于foo(1, 2, 3, 4)
foo(**kwargs)# 等价于foo(a=3, b=4)
foo(*args,**kwargs)# 等价于foo(1, 2, 3, 4, a=3, b=4)
# Python的函数是一等函数
defcreate_adder(x):
defadder(y):
returnx+y
returnadder
add_10=create_adder(10)
add_10(3)#=>13
# 也有匿名函数
(lamdax:x>2)(3)#=>True
# 有一些内置的高阶函数
map(add_10,[1,2,3])#=> [11, 12, 13]
filter(lamdax:x>5,[3,4,5,6,7])#=>[6, 7]
# 可以使用列表推导来实现映射和过滤
[add_10(i)foriin[1,2,3]]#=> [11, 13, 13]
[xforxin[3,4,5,6,7]ifx>5]#=> [6, 7]
## 5. 类
# 创建一个子类继承自object来得到一个类
classHuman(object):
# 类属性。在该类的所有示例之间共享
species="H. sapiens"
# 基本初始化构造方法
def__init__(self,name):
# 将参数赋值给实例的name属性
self.name=name
# 实例方法。所有示例方法都以self为第一个参数
defsay(self,msg):
return"%s: %s"%(self.name,msg)
# 类方法由所有实例共享
# 以调用类为第一个参数进行调用
@classmethod
defget_species(cls):
returncls.species
# 静态方法的调用不需要一个类或实例的引用
@staticmethod
defgrunt():
return"*grunt*"
# 实例化一个类
i=Human(name="Ian")
printi.say("hi")# 输出"Ian: hi"
j=Human("Joel")
printj.say("hello")# 输出"Joel: hello"
# 调用类方法
i.get_species()#=> "H. sapiens"
# 修改共享属性
Human.species="H. neanderthalensis"
i.get_species()#=> "H. neanderthalensis"
j.get_species()#=> "H. neanderthalensis"
# 调用静态方法
Human.grunt()#=>"*grunt*"
{%endhighlight%}
十分钟带你了解python 流量视频课程
学习python是一个很枯燥的过程,所以坚持是很重要的,也要学会在学习中找到乐趣,这篇文章希望可以对想学python的有所帮助。
初次接触
因此,您想学习Python编程语言,但却找不到一份简明而功能齐全的教程。本教程将尝试在10分钟内教你Python。与其说它是一个教程,不如说它是一个教程和备忘单的结合体,因此它将向您展示一些基本的概念来开始您的学习。我假设您已经熟悉编程,因此将跳过大多数非特定于语言的内容。重要的关键字将突出显示,以便您可以轻松地发现它们。另外,请注意,因为由于本教程的简洁性,有些内容将直接在代码中介绍,并且只做了简要的注释。
属性
Python是强类型(即强制类型)、动态类型、隐式类型(即不需要声明变量)、区分大小写(即var和var是两个不同的变量)和面向对象(即一切都是对象)。
得到帮助
Python中的帮助在解释器中总是可用的。如果你想知道一个对象是如何工作的,你所要做的就是调用help(
语法
Python没有强制性的语句终止字符,块由缩进指定。缩进开始一个区块,缩进结束一个区块。期望以冒号(:)结尾的缩进级别的语句。注释以英镑(#)符号开头,是单行多行字符串,用于多行注释。使用等号(" = ")为值赋值(事实上,对象绑定到名称),并使用两个等号(" == ")进行相等测试。您可以使用+=和-=操作符分别将值递增/递减。这适用于许多数据类型,包括字符串。您还可以在一行中使用多个变量。例如:
数据类型
python中可用的数据结构是列表、元组和字典。set在set库中是可用的(但是Python 2.5和更高版本中是内置的)。列表类似于一维数组(但是您也可以有其他列表的列表),字典是关联数组(又名哈希表),元组是不可变的一维数组(Python“数组”可以是任何类型,因此您可以在列表/字典/元组中混合整数、字符串等)。所有数组类型中第一项的索引为0。从结尾到开头的数都是负数,-1是最后一项。变量可以指向函数。
使用方法如下:
可以使用冒号(:)访问数组范围。将开始索引留空假设为第一项,将结束索引假设为最后一项。索引是包含互斥的,因此指定[2:10]将返回条目[2](第三项,因为是0索引)到[9](第十项),包括(8项)。从最后一项向后(因此-1是最后一项)的负索引计数如下:
字符串
它的字符串可以使用单引号或双引号,在使用另一种的字符串中也可以使用一种引号(例如,“他说‘你好’”)。“是有效的)。多行字符串包含在_triple双引号(或单引号)中。Python字符串总是Unicode,但是还有另一种字符串类型是纯字节。这些被称为bytestrings,并用b前缀表示,例如b' hello \xce\xb1'. .。要用值填充字符串,可以使用% (modulo)运算符和一个元组。每个%s都被元组中从左到右的项替换,您还可以使用字典替换,如下:
流控制语句
流控制语句是if、for和while。没有开关;相反,如果使用。用于枚举列表中的成员。要获得数字列表,请使用range(
功能
函数是用def关键字声明的。可选参数是在强制参数之后的函数声明中通过指定默认值来设置的。对于命名参数,参数的名称被赋值。函数可以返回元组(使用元组解包可以有效地返回多个值)。Lambda函数是由单个语句组成的特殊函数。参数通过引用传递,但不可变类型(元组、int、字符串等)不能由被调用方在调用方中更改。这是因为只传递了项的内存位置,将另一个对象绑定到一个变量会丢弃旧的对象,因此会替换不可变类型。例如:
类
Python在类中支持有限形式的多重继承。私有变量和方法可以通过添加至少两个前导下划线和最多一个尾随的下划线(例如__spam)来声明(按照惯例,这不是由语言强制执行的)。我们还可以将任意名称绑定到类实例。一个例子:
class MyClass(object):
common = 10
def __init__(self):
self.myvariable = 3
def myfunction(self, arg1, arg2):
return self.myvariable
# This is the class instantiation
>>> classinstance = MyClass()
>>> classinstance.myfunction(1, 2)
3
# This variable is shared by all instances.
>>> classinstance2 = MyClass()
>>>classinstancemon
10
>>>classinstance2mon
10
# Note how we use the class name
# instead of the instance.
>>> MyClassmon = 30
>>>classinstancemon
30
>>>classinstance2mon
30
# This will not update the variable on the class,
# instead it will bind a new object to the old
# variable name.
>>> classinstancemon = 10
>>>classinstancemon
10
>>>classinstance2mon
30
>>> MyClassmon = 50
# This has not changed, because "common" is
# now an instance variable.
>>>classinstancemon
10
>>>classinstance2mon
50
# This class inherits from MyClass. The example
# class above inherits from "object", which makes
# it what's called a "new-style class".
# Multiple inheritance is declared as:
# class OtherClass(MyClass1, MyClass2, MyClassN)
class OtherClass(MyClass):
# The "self" argument is passed automatically
# and refers to the class instance, so you can set
# instance variables as above, but from inside the class.
def __init__(self, arg1):
self.myvariable = 3
print(arg1)
>>> classinstance = OtherClass("hello")
hello
>>> classinstance.myfunction(1, 2)
3
# This class doesn't have a .test member, but
# we can add one to the instance anyway. Note
# that this will only be a member of classinstance.
>>> classinstance.test = 10
>>>classinstance.test
异常
Python中的异常是通过try-except [exceptionname]块来处理的:
接口(Importing)
外部库与import [libname]关键字一起使用。您还可以使用[libname] import [funcname]来处理单个函数。这是一个例子:
文件I / O
Python内建了大量的库。例如,下面是如何使用文件I/O序列化(使用pickle库将数据结构转换为字符串):
杂项(Miscellaneous)
条件可以链接:1< a < 3检查a是否小于3且大于1。
可以使用del删除数组中的变量或项。
列表理解提供了一种创建和操作列表的强大方式。它们包含一个表达式,后面跟着一个for子句,后面跟着0个或多个if或for子句,比如:
外声明的全局变量的函数,可以阅读没有任何特别的声明,但如果你想写信给他们必须声明在函数的开始与全球关键字,否则Python会将该对象绑定到一个新的局部变量(小心,这是一个小抓可以帮你如果你不知道它)。例如:
十分钟!就能带你入门Python学习!超级详细的基础教程! 互联网视频课程
十分钟!成都达内就能带你入门Python学习!超级详细的基础教程!
Python
>>>help(5)
Help on int object:
(etc etc)
>>>dir(5)
['__abs__', '__add__', ...]
>>>abs.__doc__
'abs(number) ->number
Return the absolute value of the argument.'
语法
Python中没有强制的语句终止字符,且代码块是通过缩进来指示的。缩进表示一个代码块的开始,逆缩进则表示一个代码块的结束。声明以冒号(:)字符结束,并且开启一个缩进级别。单行注释以井号字符(#)开头,多行注释则以多行字符串的形式出现。赋值(事实上是将对象绑定到名字)通过等号(“=”)实现,双等号(“==”)用于相等判断,”+=”和”-=”用于增加/减少运算(由符号右边的值确定增加/减少的值)。这适用于许多数据类型,包括字符串。你也可以在一行上使用多个变量。例如:
数据类型
Python具有列表(list)、元组(tuple)和字典(dictionaries)三种基本的数据结构,而集合(sets)则包含在集合库中(但从Python2.5版本开始正式成为Python内建类型)。列表的特点跟一维数组类似(当然你也可以创建类似多维数组的“列表的列表”),字典则是具有关联关系的数组(通常也叫做哈希表),而元组则是不可变的一维数组(Python中“数组”可以包含任何类型的元素,这样你就可以使用混合元素,例如整数、字符串或是嵌套包含列表、字典或元组)。数组中第一个元素索引值(下标)为0,使用负数索引值能够从后向前访问数组元素,-1表示最后一个元素。数组元素还能指向函数。来看下面的用法:
字符串
Python中的字符串使用单引号(‘)或是双引号(“)来进行标示,并且你还能够在通过某一种标示的字符串中使用另外一种标示符(例如 “He said ‘hello’.”)。而多行字符串可以通过三个连续的单引号(”’)或是双引号(“””)来进行标示。Python可以通过u”This is a unicode string”这样的语法使用Unicode字符串。如果想通过变量来填充字符串,那么可以使用取模运算符(%)和一个元组。使用方式是在目标字符串中从左至右使用%s来指代变量的位置,或者使用字典来代替,示例如下:
流程控制
Python中可以使用if、for和while来实现流程控制。Python中并没有select,取而代之使用if来实现。使用for来枚举列表中的元素。如果希望生成一个由数字组成的列表,则可以使用range()函数。以下是这些声明的语法示例:
Python
函数
函数通过“def”关键字进行声明。可选参数以集合的方式出现在函数声明中并紧跟着必选参数,可选参数可以在函数声明中被赋予一个默认值。已命名的参数需要赋值。函数可以返回一个元组(使用元组拆包可以有效返回多个值)。Lambda函数是由一个单独的语句组成的特殊函数,参数通过引用进行传递,但对于不可变类型(例如元组,整数,字符串等)则不能够被改变。这是因为只传递了该变量的内存地址,并且只有丢弃了旧的对象后,变量才能绑定一个对象,所以不可变类型是被替换而不是改变(译者注:虽然Python传递的参数形式本质上是引用传递,但是会产生值传递的效果)。例如:
类
Python支持有限的多继承形式。私有变量和方法可以通过添加至少两个前导下划线和最多尾随一个下划线的形式进行声明(如“__spam”,这只是惯例,而不是Python的强制要求)。当然,我们也可以给类的实例取任意名称。例如:
Python
class MyClass(object):
common = 10
def __init__(self):
self.myvariable = 3
def myfunction(self, arg1, arg2):
return self.myvariable
# This is the class instantiation
>>> classinstance = MyClass()
>>> classinstance.myfunction(1, 2)
3
# This variable is shared by all classes.
>>> classinstance2 = MyClass()
>>>classinstancemon
10
>>>classinstance2mon
10
# Note how we use the class name
# instead of the instance.
>>> MyClassmon = 30
>>>classinstancemon
30
>>>classinstance2mon
30
# This will not update the variable on the class,
# instead it will bind a new object to the old
# variable name.
>>> classinstancemon = 10
>>>classinstancemon
10
>>>classinstance2mon
30
>>> MyClassmon = 50
# This has not changed, because "common" is
# now an instance variable.
>>>classinstancemon
10
>>>classinstance2mon
50
# This class inherits from MyClass. The example
# class above inherits from "object", which makes
# it what's called a "new-style class".
# Multiple inheritance is declared as:
# class OtherClass(MyClass1, MyClass2, MyClassN)
class OtherClass(MyClass):
# The "self" argument is passed automatically
# and refers to the class instance, so you can set
# instance variables as above, but from inside the class.
def __init__(self, arg1):
self.myvariable = 3
print arg1
>>> classinstance = OtherClass("hello")
hello
>>> classinstance.myfunction(1, 2)
3
# This class doesn't have a .test member, but
# we can add one to the instance anyway. Note
# that this will only be a member of classinstance.
>>> classinstance.test = 10
>>>classinstance.test
10
导入
外部库可以使用 import [libname] 关键字来导入。同时,你还可以用 from [libname] import [funcname] 来导入所需要的函数。例如:
Python
import random
from time import clock
randomint = random.randint(1, 100)
>>> print randomint
64
文件I / O
Python针对文件的处理有很多内建的函数库可以调用。例如,这里演示了如何序列化文件(使用pickle库将数据结构转换为字符串):
其它杂项
数值判断可以链接使用,例如 1
可以使用 del 删除变量或删除数组中的元素。
列表推导式(List Comprehension)提供了一个创建和操作列表的有力工具。列表推导式由一个表达式以及紧跟着这个表达式的for语句构成,for语句还可以跟0个或多个if或for语句,来看下面的例子:
全局变量在函数之外声明,并且可以不需要任何特殊的声明即能读取,但如果你想要修改全局变量的值,就必须在函数开始之处用global关键字进行声明,否则Python会将此变量按照新的局部变量处理(请注意,如果不注意很容易被坑)。例如:
小结
本教程并未涵盖Python语言的全部内容(甚至连一小部分都称不上)。Python有非常多的库以及很多的功能特点需要学习,所以要想学好Python你必须在此教程之外通过其它方式,例如阅读Dive into Python。我希望这个教程能给你一个很好的入门指导。
十分钟学python类,类的特殊方法 企业视频课程
探究更多的类属性,在一些初学者的教程中,一般很少见。我之所以要在这里也将这部分奉献出来,就是因为本教程是“From Beginner to Master”。当然,不是学习了类的更多属性就能达到 Master 水平,但是这是通往 Master 的一步,虽然在初级应用中,本节乃至于后面关于类的属性用的不很多,但是,这一步迈出去,你就会在实践中有一个印象,以后需要用到了,知道有这一步,会对项目有帮助的。俗话说“艺不压身”。
__dict__
读者是否思考过一个问题:类或者实例属性,在 Python 中是怎么存储的?或者为什么修改或者增加、删除属性,我们能不能控制这些属性?
用 dir() 来查看一下,发现不管是类还是实例,都有很多属性,这在前面已经反复出现,有点见怪不怪了。不过,这里我们要看一个属性:__dict__,因为它是一个保存秘密的东西:对象的属性。
为了便于观察,我将上面的显示结果进行了换行,每个键值对一行。
对于类 Spring 的__dict__属性,可以发现,有一个键'season',这就是这个类的属性;其值就是类属性的数据。
用这两种方式都能得到类属性的值。或者说 Spring.__dict__['season'] 就是访问类属性。下面将这个类实例化,再看看它的实例属性:
实例属性的__dict__是空的。有点奇怪?不奇怪,接着看:
这个其实是指向了类属性中的 Spring.season,至此,我们其实还没有建立任何实例属性呢。下面就建立一个实例属性:
>>> s.season = "the spring of instance"
>>>s.__dict__
{'season': 'the spring of instance'}
这样,实例属性里面就不空了。这时候建立的实例属性和上面的那个 s.season 只不过重名,并且把它“遮盖”了。这句好是不是熟悉?因为在讲述“实例属性”和“类属性”的时候就提到了。现在读者肯定理解更深入了。
此时,那个类属性如何?我们看看:
Spring 的类属性没有受到实例属性的影响。
按照前面的讲述类属性和实例熟悉的操作,如果这时候将前面的实例属性删除,会不会回到实例属性s.__dict__为空呢?
果然打回原形。
当然,你可以定义其它名称的实例属性,它一样被存储到__dict__属性里面:
诚然,这样做仅仅是更改了实例的__dict__内容,对 Spring.__dict__无任何影响,也就是说通过 Spring.lang 或者 Spring.__dict__['lang'] 是得不到上述结果的。
那么,如果这样操作,会怎样呢?
在类的__dict__被更改了,类属性中增加了一个'flower'属性。但是,实例的__dict__中如何?
没有被修改。我也是这么想的,哈哈。你此前这这么觉得吗?然而,还能这样:
这个读者是否能解释?其实又回到了前面第一个出现 s.season 上面了。
通过上面探讨,是不是基本理解了实例和类的__dict__,并且也看到了属性的变化特点。特别是,这些属性都是可以动态变化的,就是你可以随时修改和增删。
属性如此,方法呢?下面就看看方法(类中的函数)。
结果跟前面讨论属性差不多,方法 tree 也在__dict__里面呢。
又跟前面一样。虽然建立了实例,但是在实例的__dict__中没有方法。接下来,执行:
在类(3)中有一部分内容阐述“数据流转”,其中有一张图,其中非常明确显示出,当用上面方式执行方法的时候,实例 t 与 self 建立了对应关系,两者是一个外一个内。在方法中 self.x = x,将 x 的值给了 self.x,也就是实例应该拥有了这么一个属性。
果然如此。这也印证了实例 t 和 self 的关系,即实例方法(t.tree('xiangzhangshu'))的第一个参数(self,但没有写出来)绑定实例 t,透过 self.x 来设定值,即给 t.__dict__添加属性值。
换一个角度:
这回方法中没有将 x 赋值给 self 的属性,而是直接 return,结果是:
是不是理解更深入了?
现在需要对 Python 中一个观点:“一切皆对象”,再深入领悟。以上不管是类还是的实例的属性和方法,都是符合 object.attribute 格式,并且属性类似。
当你看到这里的时候,要么明白了类和实例的__dict__的特点,要么就糊涂了。糊涂也不要紧,再将上面的重复一遍,特别是自己要敲一敲有关代码。(建议一个最好的方法:用两个显示器,一个显示器看本教程,另外一个显示器敲代码。事半功倍的效果。)
需要说明,我们对__dict__的探讨还留有一个尾巴:属性搜索路径。这个留在后面讲述。
不管是类还是实例,其属性都能随意增加。这点在有时候不是一件好事情,或许在某些时候你不希望别人增加属性。有办法吗?当然有,请继续学习。
__slots__
首先声明,__slots__能够限制属性的定义,但是这不是它存在终极目标,它存在的终极目标更应该是一个在编程中非常重要的方面:优化内存使用。
仔细看看 dir() 的结果,还有__dict__属性吗?没有了,的确没有了。也就是说__slots__把__dict__挤出去了,它进入了类的属性。
这里可以看出,类 Spring 有且仅有两个属性。
实例化之后,实例的__slots__与类的完全一样,这跟前面的__dict__大不一样了。
通过类,先赋予一个属性值。然后,检验一下实例能否修改这个属性:
看来,我们的意图不能达成,报错信息中显示,tree 这个属性是只读的,不能修改了。
因为前面已经通过类给这个属性赋值了。不能用实例属性来修改。只能:
用类属性修改。但是对于没有用类属性赋值的,可以通过实例属性:
但此时:
实例属性的值并没有传回到类属性,你也可以理解为新建立了一个同名的实例属性。如果再给类属性赋值,那么就会这样了:
当然,此时在给 t.flower 重新赋值,就会爆出跟前面一样的错误了。
这里试图给实例新增一个属性,也失败了。
看来__slots__已经把实例属性牢牢地管控了起来,但更本质是的是优化了内存。诚然,这种优化会在大量的实例时候显出效果。
零基础十分钟学Python-容器 互联网视频课程
在上篇文章中我们讲解了Python容器-列表,那么这里我们继续上篇的内容,当然如果你想看上篇的内容可以我的主页观看
3、元组
与列表类似,元组也是由任意类型元素组成的序列。于列表不同的是,元组是不可改变的,这意味着一但元组被定义,将无法再进行增加、删除或修改元素等。因此,元组就像是一个变量列表。
3.1、使用()创建元组
可以用()创建一个空元组
创建一个或多个的元时,每一个元素后面都需要跟着一个逗号,即使只包含一个元素也不能省略:
如果创建的元组所包含的元素数量超过1,最后一个元素后面的逗号都可以省略:
可以一次将元组赋值给多个变量:
可以利用元组在一条语句中对多个变量的值进行交换,而不需要借助零时变量:
tuple()函数可以用其他类型的数据类创建元组:
4、字典
字典(dictionary)与列表类似,但其中元素的顺序无关紧要,因为他们不是通过像0或1的偏移量访问的,取而代之,每个元素拥有与之对应的互不相同的键(key),需要通过键来访问元素。键通常是字符串,但它还可以是Python中其它任意的不可变类型:布尔型、浮点型、元组、字符串,以及其它一些类型。字典是可变的,因此你可以增加、删除或修改其中的键值对。
提示:在其他语言中,字典可能会被称作关系型数组、哈希表或哈希图。在Python中,字典还经常被简写成dict。
4.1、使用{}创建字典
用大括号({})将一系列以逗号隔开的键值对(key:value)包裹起来即可进行字典当的创建。最简单的字典是空字典,它不包含任何键值对:
创建一个字典:
提示:Python允许在列表、元组或字典的最后一个元素后面添加逗号,这不会产生任何问题。
4.2、使用dict()转换为字典
可以使用dict()将包含双值子序列的序列转换成字典,每个子序列的第一个元素作为键,第二个元素作为值:
可以对任何包含双值子序列的序列使用dict(),下面是其他的例子:
包含双值元组的列表:
包含双值列表的元组:
双字符的字符串组成的列表:
双字符的字符串组成的元组:
4.3、使用[key]添加或修改元素
向字典中添加元素只需要指定该元素的键并赋予相应的值即可。如果该元素的键已经存在于字典中,那么该键对应的旧值会被新值取代,如果改元素的键并未在字典中出现,则会被加入字典。
建立一个包含大多数Monty Python成员的名字字典,用他们的姓当作键,名当作值:
人员添加完成后貌似落下了一个人,生于美国的Terry Gilliam。下面是一个糟糕的程序员为了将Gilliam添加进字典而编写的代码,他粗心的将Gilliam的名字打错了:
下面是另一位颇具Python风格的程序员修改的代码:
使用通过相同的键(‘Gilliam’)将原本对应的值’Gerry’修改为为’Terry’
4.4、使用update()合并字典
使用update()可以将一个字典的键值对合并到另一个字典中去。 首先创建一个包含所有成员的字典pythons:
接着创建一个包含其他喜剧演员的字典,名为others:
现在,出现了另一位糟糕的程序员,它认为others应该被归入Monty Python成员中:
如果待添加的字典与待扩充的字典包含同样的键,新归入字典的值会取代原有的值:
4.5、使用del删除具有制定键的元素
创建一个字典:
删除Linux:
4.6、使用clear()删除所有元素
使用clear(),或者给字典变量重新赋值一空字典({})可以将字典中所有元素删除:
4.7、使用in判断是否存
如果你希望判断某一个键是否存在于一个字典中,可以使用in。
4.8、使用[key]获取元素
这是对字典最常进行的操作,只需要制定字典名和键即可获得对应的值:
如果字典中不包含一个制定的键,会产生一个异常:
有两种方法可以避免这种情况发生,第一种是在访问前通过in测试是否存在:
另一种方法是使用字典函数get():
反之,若键不存在,如果你指定了可选值,那么get()函数将返回这可选值:
否则,会得到None(在交互解释器中什么也不会显示):
4.9、使用keys()获取所有键
使用kets()可以获得字典中所有的键。
在python2里,keys()会返回一个列表,而在python3里则会返回dict_keys(),它是键的迭代形式。这种返回形式对于大型的字典非常有用,应为他不需要时间和空间来创建返回的列表,有时你需要的可能就是一个完整的列表,而在python3中,你只能自己调用list()将dict_keys()转换为列表类型。
在python3里,你同样需要手动使用list()将values()和items()的返回值转换为普通的Python列表。
4.10、使用values()获取所有值
使用values()可以获取字典中的所有值:
4.11、使用items()获取所有键值对
使用items()函数可以获取字典中所有的键值对:
每一个键值都会以元组的形式返回。
4.12、使用=赋值,使用copy()赋值
与列表一样,对字典内容进行修改会反映到所有与之相关联的变量名上:
若想避免这种情况,可以使用copy()将字典赋值到一个新的字典中:
python大牛学习笔记十分钟就入门了?! 行业视频课程
人生苦短,我用python
十分钟入门python?
这个笔记可以获取的
还是分享自己的Python学习交流群:643692991,这个笔记可以获取的
群内每天分享干货,包括2017最新的python企业案例学习资料和零基础入门教程,欢迎初学和进阶中的小伙伴入群学习交流
# 单行注释以井字符开头
""" 我们可以使用三个双引号(")或单引号(')
来编写多行注释
"""
##########################################################
## 1. 基本数据类型和操作符
# 数字
3#=>3
# 你预想的数学运算
1+1#=>2
8-1#=>7
10*2#=>20
35/5#=>7
# 除法略显诡异。整数相除会自动向下取小于结果的最大整数
11/4#=>2
# 还有浮点数和浮点数除法(译注:除数和被除数两者至少一个为浮点数,结果才会是浮点数)
2.0# 这是一个浮点数
5.0/2.0#=> 2.5 额...语法更明确一些
# 使用括号来强制优先级
(1+3)*2#=>8
# 布尔值也是基本类型数据
True
False
# 使用not来求反
notTrue#=>False
notFalse#=>True
# 相等比较使用==
1==1#=>True
2==1#=>False
# 不相等比较使用!=
1!=1#=>False
2!=1#=>True
# 更多的比较方式
1<10#=>True
1>10#=>False
2<=2#=>True
2>=2#=>True
# 比较操作可以串接!
1<2<3#=>True
2<3<2#=>False
# 可以使用"或'创建字符串
"This is a string."
'This is also a string.'
# 字符串也可以相加!
"Hello "+"world!"#=> "Hello world!"
# 字符串可以看作是一个字符列表
"This is a string"[0]#=>'T'
# None是一个对象
None#=>None
####################################################
## 2. 变量与数据容器
# 打印输出非常简单
print"I'm Python. Nice to meet you!"
# 赋值之前不需要声明变量
some_var=5# 约定使用 小写_字母_和_下划线 的命名方式
some_var#=>5
# 访问之前未赋值的变量会产生一个异常
try:
some_other_var
exceptNameError:
print"Raises a name error"
# 赋值时可以使用条件表达式
some_var=aifa>belseb
# 如果a大于b,则将a赋给some_var,
# 否则将b赋给some_var
# 列表用于存储数据序列
li=[]
# 你可以一个预先填充的列表开始
other_li=[4,5,6]
# 使用append将数据添加到列表的末尾
li.append(1)#li现在为[1]
li.append(2)#li现在为[1, 2]
li.append(4)#li现在为[1, 2, 4]
li.append(3)#li现在为[1, 2, 4, 3]
# 使用pop从列表末尾删除数据
li.pop()#=> 3,li现在为[1, 2, 4]
# 把刚刚删除的数据存回来
li.append(3)# 现在li再一次为[1, 2, 4, 3]
# 像访问数组一样访问列表
li[0]#=>1
# 看看最后一个元素
li[-1]#=>3
# 越界访问会产生一个IndexError
li[4]# 抛出一个IndexError异常
exceptIndexError:
print"Raises an IndexError"
# 可以通过分片(slice)语法来查看列表中某个区间的数据
# 以数学角度来说,这是一个闭合/开放区间
li[1:3]#=> [2, 4]
# 省略结束位置
li[2:]#=> [4, 3]
# 省略开始位置
li[:3]#=> [1, 2, 4]
# 使用del从列表中删除任意元素
delli[2]#li现在为[1, 2, 3]
# 列表可以相加
li+other_li#=> [1, 3, 3, 4, 5, 6] - 注意:li和other_li并未改变
# 以extend来连结列表
li.extend(other_li)# 现在li为[1, 2, 3, 4, 5, 6]
# 以in来检测列表中是否存在某元素
1inli#=>True
# 以len函数来检测列表长度
len(li)#=>6
# 元组类似列表,但不可变
tup=(1,2,3)
tup[0]#=>1
tup[0]=3# 抛出一个TypeError异常
exceptTypeError:
print"Tuples cannot be mutated."
# 可以在元组上使用和列表一样的操作
len(tup)#=>3
tup+(4,5,6)#=> (1, 2, 3, 4, 5, 6)
tup[:2]#=> (1, 2)
2intup#=>True
# 可以将元组解包到变量
a,b,c=(1,2,3)# 现在a等于1,b等于2,c等于3
# 如果你省略括号,默认也会创建元组
d,e,f=4,5,6
# 看看两个变量互换值有多简单
e,d=d,e#现在d为5,e为4
# 字典存储映射关系
empty_dict={}
# 这是一个预先填充的字典
filled_dict={"one":1,"two":2,"three":3}
# 以[]语法查找值
filled_dict['one']#=>1
# 以列表形式获取所有的键
filled_dict.keys()#=> ["three", "two", "one"]
# 注意 - 字典键的顺序是不确定的
# 你的结果也许和上面的输出结果并不一致
# 以in来检测字典中是否存在某个键
"one"infilled_dict#=>True
1infilled_dict#=>False
# 试图使用某个不存在的键会抛出一个KeyError异常
filled_dict['four']#=>抛出KeyError异常
# 使用get方法来避免KeyError
filled_dict.get("one")#=>1
filled_dict.get("four")#=>None
# get方法支持一个默认参数,不存在某个键时返回该默认参数值
filled_dict.get("one",4)#=>1
filled_dict.get("four",4)#=>4
# setdefault方法是一种添加新的键-值对到字典的安全方式
filled_dict.setdefault("five",5)#filled_dict["five"]设置为5
filled_dict.setdefault("five",6)#filled_dict["five"]仍为5
# 集合
empty_set=set()
# 以几个值初始化一个集合
filled_set=set([1,2,2,3,4])# filled_set现为set([1, 2, 3, 4, 5])
# 以&执行集合交运算
other_set=set([3,4,5,6])
filled_set&other_set#=> set([3, 4, 5])
# 以|执行集合并运算
filled_set|other_set#=> set([1, 2, 3, 4, 5, 6])
# 以-执行集合差运算
set([1,2,3,4])-set([2,3,5])#=> set([1, 4])
# 以in来检测集合中是否存在某个值
2infilled_set#=>True
10infilled_set#=>False
## 3. 控制流程
# 创建个变量
some_var=5
# 以下是一个if语句。缩进在Python是有重要意义的。
# 打印 "some_var is smaller than 10"
ifsome_var>10:
print"some_var is totally bigger than 10."
elifsome_var<10:
print"some_var is smaller than 10."
else:
print"some_var is indeed 10."
For循环在列表上迭代
输出:
dog is a mammal
cat is a mammal
mouse is a mammal
foranimal in["dog","cat","mouse"]:
# 可以使用%来插补格式化字符串
print"%s is a mammal"%animal
while循环直到未满足某个条件。
0
1
2
3
x=0
whilex<4:
printx
x+=1# x = x + 1的一种简写
# 使用try/except块来处理异常
# 对Python 2.6及以上版本有效
# 使用raise来抛出一个错误
raiseIndexError("This is an index error")
exceptIndexErrorase:
pass# pass就是什么都不干。通常这里用来做一些恢复工作
# 对于Python 2.7及以下版本有效
exceptIndexError,e:# 没有"as",以逗号替代
pass
## 4. 函数
# 使用def来创建新函数
defadd(x,y):
print"x is %s and y is %s"%(x,y)
returnx+y# 以一个return语句来返回值
# 以参数调用函数
add(5,6)#=> 11 并输出 "x is 5 and y is 6"
# 另一种调用函数的方式是关键字参数
add(x=5,y=6)# 关键字参数可以任意顺序输入
# 可定义接受可变数量的位置参数的函数
defvarargs(*args):
returnargs
varargs(1,2,3)#=> (1, 2, 3)
# 也可以定义接受可变数量关键字参数的函数
defkeyword_args(**kwargs):
returnkwargs
# 调用一下该函数看看会发生什么
keyword_args(big="foot",loch="ness")#=> {"big": "foo", "loch": "ness"}
# 也可以一次性接受两种参数
defall_the_args(*args,**kwargs):
printargs
printkwargs
all_the_args(1, 2, a=3, b=4)输出:
[1, 2]
{"a": 3, "b": 4}
# 在调用一个函数时也可以使用*和**
args=(1,2,3,4)
kwargs={"a":3,"b":4}
foo(*args)#等价于foo(1, 2, 3, 4)
foo(**kwargs)# 等价于foo(a=3, b=4)
foo(*args,**kwargs)# 等价于foo(1, 2, 3, 4, a=3, b=4)
# Python的函数是一等函数
defcreate_adder(x):
defadder(y):
returnx+y
returnadder
add_10=create_adder(10)
add_10(3)#=>13
# 也有匿名函数
(lamdax:x>2)(3)#=>True
# 有一些内置的高阶函数
map(add_10,[1,2,3])#=> [11, 12, 13]
filter(lamdax:x>5,[3,4,5,6,7])#=>[6, 7]
# 可以使用列表推导来实现映射和过滤
[add_10(i)foriin[1,2,3]]#=> [11, 13, 13]
[xforxin[3,4,5,6,7]ifx>5]#=> [6, 7]
## 5. 类
# 创建一个子类继承自object来得到一个类
classHuman(object):
# 类属性。在该类的所有示例之间共享
species="H. sapiens"
# 基本初始化构造方法
def__init__(self,name):
# 将参数赋值给实例的name属性
self.name=name
# 实例方法。所有示例方法都以self为第一个参数
defsay(self,msg):
return"%s: %s"%(self.name,msg)
# 类方法由所有实例共享
# 以调用类为第一个参数进行调用
@classmethod
defget_species(cls):
returncls.species
# 静态方法的调用不需要一个类或实例的引用
@staticmethod
defgrunt():
return"*grunt*"
# 实例化一个类
i=Human(name="Ian")
printi.say("hi")# 输出"Ian: hi"
j=Human("Joel")
printj.say("hello")# 输出"Joel: hello"
# 调用类方法
i.get_species()#=> "H. sapiens"
# 修改共享属性
Human.species="H. neanderthalensis"
i.get_species()#=> "H. neanderthalensis"
j.get_species()#=> "H. neanderthalensis"
# 调用静态方法
Human.grunt()#=>"*grunt*"
{%endhighlight%}