URN Logo
UNIX Resources » Linux » China Linux Forum » Python 编 程 » 9 » 初学pyton ------ 批评python的数据类型
announcement 声明: 本页内容为中国Linux论坛的内容镜像,文章的版权以及其他所有的相关权利属于中国Linux论坛和相应文章的作者,如果转载,请注明文章来源及相关版权信息。
Resources
China Linux Forum(finished)
Linux Forum(finished)
FreeBSD China(finished)
linuxforum.net
  业界新闻与评论
  自由软件杂谈
  IT 人生
  Linux软件快递
  翻译作坊
  Linux图书与评论
  GNU Emacs/XEmacs
  Linux 中文环境和中文化
  Linux桌面与办公软件
  Linux 多媒体与娱乐版
  自由之窗Mozilla
  笔记本电脑上的Linux
  Gentoo
  Debian 一族
  网络管理技术
  Linux 安装与入门
  WEB服务器和FTP服务器
  域名服务器和邮件服务器
  Linux防火墙和代理服务器应用
  文件及打印服务器
  技术培训与认证
  Linux内核技术
  Linux 嵌入技术
  Linux设备驱动程序
  Linux 集群技术
  LINUX平台数据库
  系统和网络安全
  CPU 与 编译器
  系统计算研究所专栏
  Linux下的GUI软件开发
  C/C++编程版
  PHP 技 术
  Java&jsp技术
  Shell编程技术
  Perl 编 程
  Python 编 程
  XML/Web Service 技术
  永远的Unix
  FreeBSD世界
   
初学pyton ------ 批评python的数据类型
初学pyton ------ 批评python的数据类型 - zhangxp [2005-05-31 21:42 | 2,475 byte(s)]
 
 
 
 
 
 
 
Re: 初学pyton ------ 批评python的数据类型 - limodou [2005-06-05 11:18 | 1,905 byte(s)]
 
 
Subject: 初学pyton ------ 批评python的数据类型
Author: zhangxp    Posted: 2005-05-31 21:42    Length: 2,475 byte(s)
[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]
Subject: Re: 初学pyton ------ 批评python的数据类型
Author: ttvast    Posted: 2005-06-01 19:27    Length: 245 byte(s)
[Original] [Print] [Top]
() 或者叫TUPLE 在python 中是很有用的啊,因为它是静态内容,因此他的储存结构相对LIST就会简单的多.因此在资源性能等方面,TUPLE比LIST处理静态内容的优势是很大的.

不过这位兄台批评别人也太激进一点,或许是因为您比PYTHON开发人的水平高太多吧
[Original] [Print] [Top]
Subject: Re: 初学pyton ------ 批评python的数据类型
Author: zhangxp    Posted: 2005-06-03 08:51    Length: 331 byte(s)
[Original] [Print] [Top]
您别客气,我只是python一菜鸟,

说错了你只管使劲批。。^_^


可能我只考虑了语言对使用者的角度,应该设计成什么样子的,没有考虑程序规模变大后,出现的问题。


在比较大型的程序中,不使用元组不知道行不行,但我想是可以的,当效率变得真的很重要时,我就用c扩展了,呵呵。
----
弃我去者昨日之日不可留,乱我心者今日之日多烦忧!
[Original] [Print] [Top]
Subject: Re: 初学pyton ------ 批评python的数据类型
Author: limodou    Posted: 2005-06-04 12:24    Length: 191 byte(s)
[Original] [Print] [Top]
使用C扩展必竟是件麻烦事。tuple正如二楼所说是不可变的,因些它可以用作字典中的key,这一点list就不行了。再有就是执行效率上。光按照数组的角度差不多,但从可变与不可变的区别上,还是用法有些不同的。
----
[Original] [Print] [Top]
Subject: Re: 初学pyton ------ 批评python的数据类型
Author: zhangxp    Posted: 2005-06-04 18:33    Length: 656 byte(s)
[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]
Subject: Re: 初学pyton ------ 批评python的数据类型
Author: zhangxp    Posted: 2005-06-04 18:36    Length: 240 byte(s)
[Original] [Print] [Top]
所以,,我仍然觉着

1。效率的理由过于牵强。

2。可以用作字典中的key,这一点list就不行 ,以及 可变不可变用法上的区别

都是由于python被设计成这样而造成的。


----
弃我去者昨日之日不可留,乱我心者今日之日多烦忧!
[Original] [Print] [Top]
Subject: Re: 初学pyton ------ 批评python的数据类型
Author: limodou    Posted: 2005-06-05 11:18    Length: 1,905 byte(s)
[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]
Subject: Re: 初学pyton ------ 批评python的数据类型
Author: lch21    Posted: 2005-06-06 00:34    Length: 263 byte(s)
[Original] [Print] [Top]
常量的存在是非常重要的
C++就加强了const,用于提高程序的可读性和健壮性
高级语言的设计并不是使用越灵活越好, 有了变量就不要常量.
事实上,在适当的地方使用常量可以降低程序的错误率, 防止不应该的修改,
尤其在规模较大,修改人数较多的程序中
----
www.hn2sh.com 湖南人在上海-社区
[Original] [Print] [Top]
Subject: Re: 初学pyton ------ 批评python的数据类型
Author: ly602    Posted: 2005-06-06 13:04    Length: 115 byte(s)
[Original] [Print] [Top]
非也,非也!tuple类型是高效的做法,省去使用过多的变量,执行效率高,传递变量稳定放心,好处很多,不算多余,更非鸡肋!
[Original] [Print] [Top]
« Previous thread
『新手请教』怎么把一个文件里特定范围内的段落copy到另外一个新的文件里
Python 编 程
9
Next thread »
如何随机打乱一个字符串?
     

Copyright © 2007 UNIX Resources Network, All Rights Reserved.      About URN | Privacy & Legal | Help | Contact us
备案序号: 京ICP备05006143    webmaster: webmaster@unixresources.net
This page created on 2008-07-17 04:11:11, cost 0.045550107955933 ms.