Clojure练习-5.组合数据类型

Clojure练习-5.组合数据类型

“用100个函数来操作一个数据结构比10个函数操作10个数据结构要好很多。基于一个统一的数据结构,我们可以构建出一系列的小函数,这些小函数又可以组合起来形成一个强大的系统。而为不同的数据结构编写不同的函数,在根本上就削减了复用的可能。” —— [ Alan Perlis ]

  • Clojure练习-5组合数据类型

    • 组合数据类型

      • 知识汇总 实现一个索引函数

        • 解1
        • 测试
        • 解2
        • 测试
      • 其他

5. 组合数据类型

知识汇总: 实现一个索引函数

实现一个函数,在一个序列里定位某个函数的位置索引。

这个函数必须:

  1. 可以接受任意组合类型
  2. 顺序集合返回数字索引,对mapset返回key
  3. 否则返回nil

解1

(defn index-of-coll
   "索引函数
    输入: coll,e  (coll代表集合类型:顺序类型 set或者map) (e是用来匹配的项)
    返回:索引号   (特殊的map返回key)
  "
  {:added "1.0"}
  [coll e]
  (let [cmp (if (map? coll) #(= (second %1) %2) #(= %1 %2)) ] ;; 定义比较表达式
    ;; 遍历比较
    (loop [s coll, idx 0] ;; 开始循环
      (when (seq s) ;; 退出条件
        (if (cmp (first s) e) ;; 如果相等
             (if (map? coll) ;; 如果是map
               (first (first s))  ;; 返回key
               idx) ;; 否则返回索引
             (recur (next s) (inc idx))))))) ;; 跳转到循环

测试

(def a-to-z (map char (range 97 123)))

(index-of-coll a-to-z \z) ;=> 25
(index-of-coll (set a-to-z) \z) ;=>25

(def A-to-Z (map char (range 65 91)))
(def my-map (zipmap A-to-Z a-to-z))

(index-of-coll my-map \z) ;=> \Z

解2

(defn index-of-coll‘
  {:added "终极版"}
  [coll] (cond (map? coll) (seq coll) (set? coll) (map vector coll coll) :else (map vector (iterate inc 0) coll) ))
(defn pos
     "索引函数
    输入: coll,e  (coll代表集合类型:顺序类型 set或者map) (e是用来匹配的项)
    返回:索引号   (特殊的map返回key)
  "
  {:added "终极版"}
  [coll ele]
  (for [[i e] (index-of-coll‘ coll ) :when (= e ele)]  i))

测试

(pos A-to-Z \Z) ;=> (25)
(pos (set a-to-z) \z) ;=> (\z)
(pos my-map \z) ;=> (\Z)

其他

“很难找到这样的两种语言(Pascal和Lisp),它们能如此清晰地代表着围绕这两种语言而聚集起来的两种差异巨大的文化。Pascal是为了构造金字塔————壮丽而辉煌、令人震撼,是由各就其位的沉重巨石筑起的静态结构。而Lisp则是为了构造有机体————同样的壮丽辉煌并令人震撼,由各就其位但却永不静止的无数简单的有机体片段构成动态结构。在两种语言里都采用了同样的组织原则,除了其中特别重要的一点不同之外:托付给Lisp程序员个人可用的自由支配权,要远远超过那些使用Pascal的公司。Lisp程序大大抬高了函数库的地位,使其可用性超越了催生它们的那些具体应用。……

而在Pascal里,数据结构的过度声明导致函数的专用性,阻碍并惩罚临时性的合作,(在Pascal中)采用100个函数在一种数据结构上操作,远远优于用10个函数在10种数据结构上操作。作为这些情况的必然后果,金字塔矗立在那里千年不变,而有机体则必须演化,否则就会死亡。”

本Markdown编辑器使用[StackEdit][6]修改而来,用它写博客,将会带来全新的体验哦:



[1]: SICP读书笔记(2)——扉页,序 - - ITeye技术网站

http://kidneyball.iteye.com/blog/923957

[2]:Fun with underscore.js - GitBook

https://www.gitbook.com/book/juntao/fun-with-underscore/details

[3]: Clojure 学习入门(12)—— map/pmap - IT-Homer - 博客频道 - CSDN.NET

http://blog.csdn.net/ithomer/article/details/17591499

时间: 2024-10-13 18:17:51

Clojure练习-5.组合数据类型的相关文章

Python3组合数据类型(元组、列表、集合、字典)语法

一.序列类型(字符串,元组(),列表[]) 序列类型支持in,len(),分片[],迭代,5种内置序列类型:bytearray,bytes,list,str,tuple(元组). 1.元组可以嵌套(如:x=str[2][1][0][1]) 2.元组的命名(collections.namedtuple(),即自定义) 样:sale=collctions.namedtuple("sale","productid customerid date price") 逗号前的为

组合数据类型字典

dict是一种无序的组合数据类型,其中包含0个或多个键-值对,可以对其进行数据项的添加或移除操作. 创建字典 d1 = {“id”:1991,"name":"yoyo","size":6} >>> d1{'id': 1991, 'size': 6, 'name': 'yoyo'}>>> d1["id"]  #查询1991 >>> d1["age"] =

字符串、组合数据类型练习

一.字符串练习: 1.http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html 取得校园新闻的编号 url="http://news.gzcc.cn/html/2017/xiaoyuanxinwen_1027/8443.html" print(url[-14:-5]) 2.https://docs.python.org/3/library/turtle.html 产生python文档的网址 abbr1='http://new

组合数据类型练习

1.组合数据类型练习: 分别定义字符串,列表,元组,字典,集合,并进行遍历. 1.定义字符串,并进行遍历 >>> str="987" >>> for i in str: print(i) 2.定义列表,并进行遍历 >>> a=['9','7','8'] >>> for i in a: print(i) 3.定义元祖,并进行遍历 原文地址:https://www.cnblogs.com/126lc/p/8622608

计算机二级python 知识点篇(组合数据类型)

计算机二级python 知识点篇(组合数据类型) 集合.列表.字符串.元组.字典 集合类型 : 集合 (无序.无相同元素) 序列类型 :列表.字符串.元组 (有序.元素之间不排他) 映射类型 :字典 集合 集合概述 集合中元素不可重复, 元素类型只能是固定数据类型,例如: 整数. 浮点数. 字符串. 元组等, 列表. 字典和集合类型本身都是可变数据类型, 不能作为集合的元素出现 >>>S = {1010, "1010", 78.9} >>>type(

测验6: 组合数据类型 (第6周)-单选题

1.???????????????????????????????????????????????????????????????????????????????? 关于Python组合数据类型,以下描述错误的是:???????????????????????????????????????????????????????????????????????????????? A.Python的字符串.元组和列表类型都属于序列类型 B.组合数据类型能够将多个相同类型或不同类型的数据组织起来,通过单一

python组合数据类型和数据结构

//2019.12-071.pyhton里面组合数据类型主要有三种:集合(set).序列(字符串str.列表list and 元组tuple)和映射(字典dic)2.集合类型一般使用大括号{}来进行表示,并且里面的集合元素没有索引和位置的概念,元素是独一无二和无序的,可以用来过滤相同的元素.3.字典的定义是使用{}来进行定义,也可以使用dict()来进行字典的定义,{}不可以定义集合组合数据,组合数据是用set()函数来进行定义.4.删除字典里面的键值对可以使用del保留字来实现,del s[k

英文词频统计预备 组合数据类型练习

1.实例: 下载一首英文的歌词或文章,将所有,.?!等替换为空格,将所有大写转换为小写,统计某几个单词出现的次数,分隔出一个一个的单词. big='''OoohOooh Put your make-up onGet your nails doneCurl your hairRun the extra mileKeep it slim so they like you, do they like you? Get your sexy onDon't be shy, girlTake it offT

组合数据类型练习,英文词频统计实例上

字典实例:建立学生学号成绩字典,做增删改查遍历操作. #创建一个空字典 dict={} s=dict print(s) #增加键值对(学号-成绩) s['001']=60 s['002']=70 s['003']=80 s['004']=90 print(s) #删除 s.pop('004') print(s) #修改 s['001']=69 print(s) #查找键是否存在 s.get('005','不存在') print(s) #便历 for i in s: print(i) 2.列表,元