果果编程课】004 数字变形工厂(map)

课程目标(45分钟)

学会 map:一次性对列表中所有元素做同样的操作


第一部分:问题引入(5分钟)

老师故事

“上节课果果攒了零花钱 (list 10 20 30 40 50)。如果每笔钱都变成2倍,怎么办?”

一个一个改?太累了!今天教你 数字变形工厂 —— 一个咒语,整串数字一起变!


第二部分:认识 map(15分钟)

1. 基本语法(5分钟)

1
2
3
4
5
6
#lang racket

(define savings (list 10 20 30 40 50))

; 启动变形工厂:每个数字×2
(map (lambda (n) (* n 2)) savings)

运行结果'(20 40 60 80 100)

解释

  • map = 变形工厂启动
  • (lambda (n) (* n 2)) = 机器说明书:”拿数字n,输出n×2”
  • savings = 原材料

2. 动手练习(10分钟)

练习1:加10机器

1
2
(map (lambda (n) (+ n 10)) savings)
; 结果:'(20 30 40 50 60)

练习2:变字符串机器

1
2
(map (lambda (n) (number->string n)) savings)
; 结果:'("10" "20" "30" "40" "50")

练习3:加”元”机器

1
2
3
4
  (map (lambda (n) 
(string-append (number->string n) "元"))
savings)
; 结果:'("10元" "20元" "30元" "40元" "50元")

小挑战:把每个数字变成它的平方

1
2
(map (lambda (n) (* n n)) savings)
; 结果:'(100 400 900 1600 2500)


第三部分:string列表变形(15分钟)

1. 名字大变身(8分钟)

1
2
3
4
5
(define names (list "果果" "小明" "小红"))

; 加"同学"
(map (lambda (name) (string-append name "同学")) names)
; 结果:'("果果同学" "小明同学" "小红同学")

练习:加”你好,”在前面

1
2
(map (lambda (name) (string-append "你好," name)) names)
; 结果:'("你好,果果" "你好,小明" "你好,小红")

2. 重复魔法(7分钟)

1
2
3
; 每个名字重复3遍
(map (lambda (name) (string-append name name name)) names)
; 结果:'("果果果果果果" "小明小明小明" "小红小红小红")

练习:名字变”名字!”

1
2
(map (lambda (name) (string-append name "!")) names)
; 结果:'("果果!" "小明!" "小红!")


第四部分:综合练习(8分钟)

挑战:制作价格标签

1
2
3
4
5
6
7
8
(define prices (list 10 25 50 100))

; 目标:'("价格:10元" "价格:25元" ...)
(map (lambda (p)
(string-append "价格:"
(number->string p)
"元"))
prices)

进阶:如果价格>50,加”(贵)”

1
2
3
4
5
6
(map (lambda (p)
(if (> p 50)
(string-append (number->string p) "元(贵)")
(string-append (number->string p) "元")))
prices)
; 结果:'("10元" "25元" "50元" "100元(贵)")


第五部分:总结(2分钟)

核心口诀

map 就是批量变形术:
(map 变形机器 列表) → 新列表

回家作业

  1. (list 1 2 3 4 5) 每个数字变成 "第X名"(X是数字)
  2. (list "苹果" "香蕉" "橘子") 每个变成 "我爱吃XX"

都考100分哦

果果编程第4课

下节课预告

“下节课学 compose 组合魔法 —— 把多个变形机器拼成一个超级机器!”


板书

1
2
3
4
5
6
7
8
map = 数字变形工厂
(map (lambda (x) ...) 列表)

常用变形:
(* x 2) → 翻倍
(+ x 10) → 加10
(number->string x) → 变文字
(string-append x "元") → 加单位