|
[Original]
[Print]
[Top]
|
总的来说,python的数据据类型,少,简单,实用,仅数字,字符串,列表,字典这四种基本数据类型,就足够完成你在其他语言中需要n种类型才能完成的任务,不愧称为是”设计的简洁,优雅“。。
但是,元组,,这个多余出来的类型,却是一个非常大的败笔!
元组,实际上就是序列不可变的列表,书中《pythoin语言入门》对改类型存在的解释是:历史原因和元组的不变性提供某些整体特性。该解释,难免有些牵强附会,不想改变序列,程序中不变不就可以了?还需要大费周章的搞出一种数据类型来。倘若本身数据类型就很多,再加上一个也无伤大雅,加就加上吧;但是原先只有少的可怜的4种几本数据类型,一加上元组,本身简介、优雅的感觉,已经少了大半,视线已经被元组这个冗余,累赘所代替!
再看一些表现:
>>> a , b =12, 34
>>> a, b
(12, 34)
>>> (a, b)
(12, 34)
>>> [a, b]
[12, 34]
>>> print a, b
12 34
>>> print (a, b)
(12, 34)
>>> print [a, b]
[12, 34]
熟悉python可能并不觉着有什么,也能这么理解:
a, b (a,b) 都 相当于生成了一个元组。
print a , b 是逐个打印变量,不生成元组。。
但是,从第一眼的感觉来说,为什么非要a, b和(a, b)的结果都是是(12, 34)呢??
为什么a, b 的结果是(12, 34) print a, b的结果是12, 34
而(a, b)的结果是(12, 34) print a, b的结果是(12, 34)呢??
这些不能不说是语言设计上的失误!
建议如下:
1,让python的后续版本种取消元组数据类型及相关语法,即去掉:
a, b = 12, 34
(a, b) = (123, 234)等,
让
a, b
(a ,b)
这样的语句不合法。
再怎么样,让a, b的输出为[12 , 34]也比(12, 34)好啊!
或者已经取消了??(不太知道。。)
2,如果我们没有办法将元组从语言种中去除,,我们自己可以人为的抵制不用它,没有坏处。
即不要这样写:
a, b = 12, 34
(a, b) = (123, 234)
而要这样写:
[a, b] = [12, 34]
总之,不要让元组的小括号出现在你的程序中!!! (函数调用其他地方的小括号当然不能不出现了。)
学习python数据类型后的一些感想,可能由于python没学完,犯了片面急躁的错误。。
说错了请纠正,非常感谢!!!
|
|
|
----
弃我去者昨日之日不可留,乱我心者今日之日多烦忧!
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
() 或者叫TUPLE 在python 中是很有用的啊,因为它是静态内容,因此他的储存结构相对LIST就会简单的多.因此在资源性能等方面,TUPLE比LIST处理静态内容的优势是很大的.
不过这位兄台批评别人也太激进一点,或许是因为您比PYTHON开发人的水平高太多吧
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
您别客气,我只是python一菜鸟,
说错了你只管使劲批。。^_^
可能我只考虑了语言对使用者的角度,应该设计成什么样子的,没有考虑程序规模变大后,出现的问题。
在比较大型的程序中,不使用元组不知道行不行,但我想是可以的,当效率变得真的很重要时,我就用c扩展了,呵呵。
|
|
|
----
弃我去者昨日之日不可留,乱我心者今日之日多烦忧!
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
|
使用C扩展必竟是件麻烦事。tuple正如二楼所说是不可变的,因些它可以用作字典中的key,这一点list就不行了。再有就是执行效率上。光按照数组的角度差不多,但从可变与不可变的区别上,还是用法有些不同的。
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
<<tuple正如二楼所说是不可变的,因些它可以用作字典中的key,这一点list就不行了。
字典 {(a,b):123, (c,d):456 }
元组可以用作字典中的key,这一点list就不行了,这是pyton的约定。。
可是还是这个问题,站在语言设计者和使用者的角度,为什么元组可以作字典中的key,,而列表旧不可以呢??
比如列表的字典可以这样:
key1 = [a, b]
key2 = [c, d]
{key1:123, key2:456}
可以改变key1 = [a, b, c]
字典的key就变为[a,b,c]和[c,d]
这样不是很好??
|
|
|
----
弃我去者昨日之日不可留,乱我心者今日之日多烦忧!
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
所以,,我仍然觉着
1。效率的理由过于牵强。
2。可以用作字典中的key,这一点list就不行 ,以及 可变不可变用法上的区别
都是由于python被设计成这样而造成的。
|
|
----
弃我去者昨日之日不可留,乱我心者今日之日多烦忧!
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
所以python对key的要求是不可变是因为一但key变了,那么你可能就找不到原来的key了。而且还造成与你保存的key不同,很容易出现逻辑错误。你所写的
>> key1 = [a, b]
>> key2 = [c, d]
>> {key1:123, key2:456}
>> 可以改变key1 = [a, b, c]
这种写法是存在问题的。python的变量是名字绑定,那么在赋值的时候可以改变这种绑定。因此key1=[a,b]后再执行key1=[a,b,c]根本不是修改得原来的东西。这一点可以通过id(key1)来判断。如:
>>> key1=['a', 'b']
>>> id(key1)
13254416
>>> key1=['a', 'b', 'c']
>>> id(key1)
13254480
所以key1已经不在是你想象的原来的key1了。如果想在原来的key1上进行修改应该是key1.append()或key1.remove()或key1.insert()之类的操作。
以上是说明你不能简单的将key保存到一个变量中,然后直接赋值进行修改它的值。如果你可以做到不通过赋值来修改key值,那么就存在以下问题:
1.如何得到key对应的对象的引用,然后不能通过赋值来修改它。在创建一个dict时可能保存引用时还算容易,但如果引用别人的dict中的key如何做到呢?使用keys()吗?总之是变得麻烦
2.有多少情况下会修改key值呢?
python这种约定是为了简化处理。至于效率问题那只有看一看源代码作一些测试才清楚,而且的确使用tuple作大量的计算是不现实的。但它有一个好处是不能修改,在某些地方可以保证它的唯一性,就象dict中的key或某些常量的定义。至少在一些小地方使用起来还很方便。其实如果你不喜欢它完全可以不使用它,因为python提供了别的方法也可以做到。
总之某些东西就是仁者见仁智者见智的东西,这些东西大家说了算。关于这些东西在python中已经存在许多了,如lambda, decorator等等,有人喜欢也有人不喜欢,但它的确是存在着,也许以后会改变,说不清。但存在就有存在的道理,只不过有些理由可能你并不满意罢了。
|
|
|
----
|
|
[Original]
[Print]
[Top]
|
|
[Original]
[Print]
[Top]
|
常量的存在是非常重要的
C++就加强了const,用于提高程序的可读性和健壮性
高级语言的设计并不是使用越灵活越好, 有了变量就不要常量.
事实上,在适当的地方使用常量可以降低程序的错误率, 防止不应该的修改,
尤其在规模较大,修改人数较多的程序中
|
|
|
----
|
|
[Original]
[Print]
[Top]
|
|