需求:给定的单词,然后输出其复数形式(特殊情况除外)?

初级demo1:非封装函数法,一个函数解决所有。

import  redef plural(noun):if re.search('[sxz]$', noun):return re.sub('$', 'es', noun)elif re.search('[^aeioudgkprt]h$', noun):return re.sub('$', 'es', noun)elif re.search('[^aeiou]y$', noun):return re.sub('y$', 'ies', noun)else:return noun + 's'
#实现函数调用,求单次复数形式print(plural('zoo'))
print(plural("kitty"))
print(plural('coach'))
'''结果如下:
zoos
kitties
coaches
'''

进阶demo2:将功能全部抽象,剥离成函数

import re#每条匹配规则都有自己的函数,它们返回对re.search() 函数调用结果。#实现对sxz结尾单词的匹配和复数输出函数
def match_sxz(noun):return re.search('[sxz]$', noun)
def apply_sxz(noun):return re.sub('$', 'es', noun)#实现对*h结尾单词的匹配和复数输出函数
def match_h(noun):return re.search('[^aeioudgkprt]h$', noun)
def apply_h(noun):return re.sub('$', 'es', noun)#实现对*y结尾单词的匹配和复数输出函数
def match_y(noun):return re.search('[^aeiou]y$', noun)
def apply_y(noun):return re.sub('y$', 'ies', noun)#实现对上面三种情况之外的单词输出复数
def match_default(noun):return True
def apply_default(noun):return noun + 's'#一个函数对的序列,而不是一个函数(plural())实现多个条
rules = ((match_sxz, apply_sxz),(match_h, apply_h),(match_y, apply_y),(match_default, apply_default))def plural(noun):for matches_rule, apply_rule in rules:if matches_rule(noun):return apply_rule(noun)#实现函数调用,求单次复数形式print(plural('zoo'))
print(plural("kitty"))
print(plural('coach'))'''结果如下:
zoos
kitties
coaches
'''

分析:该技术能够成功运作的原因是 Python 中一切都是对象,包括了函数。数据结构 rules 包含了函数——不是函数的名称,而是实际的函数对象。在 for 循环中被赋值后, matches_rule 和apply_rule 是可实际调用的函数。在第一次 for 循环的迭代过程中,这相当于调用 matches_sxz(noun),如果返回一个匹配值,将调用 apply_sxz(noun) 。

高阶demo3:闭合函数

import re#在动态函数中使用外部参数值的技术称为 闭合【closures】
def build_match_and_apply_functions(pattern, search,replace):def matches_rule(word):return re.search(pattern, word)def apply_rule(word):return re.sub(search, replace, word)return (matches_rule, apply_rule)#英语单词常见的4种复数变形方式
patterns = \(('[sxz]$', '$', 'es'),('[^aeioudgkprt]h$', '$', 'es'),('(qu|[^aeiou])y$', 'y$', 'ies'),('$', '$', 's'))rules = [build_match_and_apply_functions(pattern, search,replace)for (pattern, search, replace) in patterns]
'''
它以 patterns 中的字符串序列为参数,并将其转换为一个函数序列。怎么做到的?通过将字符串“映
射”到 build_match_and_apply_functions() 函数。也就是说,它接受每组三重字符串为参数,并将该三个字符串作为实参调用build_match_and_apply_functions() 函数build_match_and_apply_functions() 函数返回一个包含两个函数的元组。也就是说
该规则 最后的结尾与前例在功能上是等价的:一个元组列表,每个元组都是一对函数。第一个函数是调用 re.search() 的匹配函数;
而第二个函数调用 re.sub() 的应用函数
'''def plural(noun):for matches_rule, apply_rule in rules:if matches_rule(noun):return apply_rule(noun)#实现函数调用,求单次复数形式print(plural('zoo'))
print(plural("kitty"))
print(plural('coach'))'''结果如下:
zoos
kitties
coaches
'''

统一声明:关于原创博客内容,可能会有部分内容参考自互联网,如有原创链接会声明引用;如找不到原创链接,在此声明如有侵权请联系删除哈。关于转载博客,如有原创链接会声明;如找不到原创链接,在此声明如有侵权请联系删除哈。

python函数的闭合:实现给定的单词输出复数形式相关推荐

  1. Python解一元一次方程和一元二次方程,输出数学形式和小数形式

    Python解一元一次方程和一元二次方程,输出数学形式和小数形式 一元一次方程 一元二次方程 完整代码 运行结果 创建函数: def eqt(c,b,a=0): 其中,a.b.c分别是二次项系数.一次 ...

  2. python中从键盘输入五个单词输出以元音字母开头的单词_Python程序设计入门——第五周作业...

    这里记录在网易云课堂上的课后作业,Python环境为2.7,如果您有更好的算法还望斧正! 1.题目内容: "Pig Latin"是一个英语儿童文字改写游戏,整个游戏遵从下述规则: ...

  3. 字符串倒序函数 java_编写将给定字符串倒序输出的函数[Java笔试题]

    面试的过程中经常会出现这样一个问题:写一个函数,将给定的字符串倒叙输出. 以下是StringReverseOpt定义静态方法: public class StringReverseOpt { /** ...

  4. python基础-python函数参数为print语句时的输出

    函数参数输入print语句,调用函数时都会执行print语句,实例: def outer(func):def inner():print("我是内层函数!")return inne ...

  5. HDOJ/HDU 1804 Deli Deli(英语单词复数形式~)

    Problem Description Mrs. Deli is running the delicatessen store "Deli Deli". Last year Mrs ...

  6. python函数求n年后本息_Python自定义函数计算给定日期是该年第几天的方法示例...

    本文实例讲述了Python自定义函数计算给定日期是该年第几天的方法.分享给大家供大家参考,具体如下: 写一个函数,计算给定日期是该年的第几天. 满足闰年的条件: 闰年是公历中的名词,能被4整除但不能被 ...

  7. python怎么命名未知数_码如其人,小老弟,你能写一手漂亮的Python函数吗

    与多数现代编程语言一样,在 Python 中,函数是抽象和封装的基本方法之一.你在开发阶段或许已经写过数百个函数,但并非每个函数都生而平等.写出「糟糕的」函数会直接影响代码的可读性和可维护性.那么,什 ...

  8. python函数的组成要素_python函数要素有哪些?这7点是你写好python代码的关键

    [摘要]对于python小白来说,写好一个python代码并不容易,不过你知道python函数要素有哪些?这7点是你写好python代码的关键,如果你想学好python,那么本文内容一定要自己试试,毕 ...

  9. 【Python基础入门系列】第05天:Python函数

    前面我们写过九九乘法表,但如果我要七七乘法表或五五乘法表的话,你会看到三者代码极其类似,只是循环变量不同,那么如何做到代码重用,而不是简单拷贝黏贴修改呢,其实可是使用函数完成这一功能! 先来试着看一看 ...

最新文章

  1. nodejs -- promise的返回
  2. 三招教你如何判断ERP软件是否适用
  3. Android --- 调用MediaStore.Images.Media.insertImage保存图片时生成两张图片的问题
  4. 第三次学JAVA再学不好就吃翔(part107)--字符流的拷贝
  5. 深度有趣 | 30 快速图像风格迁移
  6. 计算机视觉论文-2021-06-16
  7. Sphinx——自动生成Python文档
  8. 推荐系统中粗排扮演的角色和算法发展历程
  9. mysql 撤销权限_MySQL撤销权限(Revote语句)
  10. 纸质书,电子书,你会选择通过哪一种途径学习?
  11. Echarts数据可视化series-heatmap热力图,开发全解+完美注释
  12. WCP源码分析 与SpringMVC学习资料
  13. ISO20000/ISO27001体系认证最短周期
  14. 神舟战神换cpu教程_神舟战神能换什么cpu 神舟战神Z7可以换CPU吗
  15. 【Ubuntu】解决ubuntu无法上网问题
  16. matlab中options,[转载]Matlab优化函数中options选项的修改
  17. linux进程等待wait()实例
  18. Web前端HTML+CSS全套(1~20)
  19. edittext 光标不显示_大家有没有遇到过edittext不显示光标的情况?
  20. NUC系列迷你电脑改装苹果网卡的又一神器方案

热门文章

  1. uniapp关闭默认返回安卓和ios
  2. 智慧物业小程序_智慧物业员工APP业主APP小程序报事流程
  3. python里的df_python – 从pandas df中删除行
  4. 华为设备配置VRRP与路由联动监视上行链路
  5. KKB : maven的介绍
  6. 2020年终总结,不容易的一年
  7. 一建公共课推荐老师详解
  8. PHP向数据库循环插入数据,php实现向mysql批量插入数据
  9. 服务器能不能用普通硬盘,服务器硬盘和普通硬盘区别 服务器硬盘比普通硬盘贵在哪?...
  10. word2007中快捷键的设置【接受修订】