学习笔记
未读引入 递归是一种广泛应用算法。它能够把一个大型复杂的问题转化为一个与原问题相似的较小规模的问题来求解,用非常简洁的方法来解决重要问题。就像一个人站在装满镜子的房间中,看到的影像就是递归的结果。递归在数学和计算机应用上非常强大,能够非常简洁的解决重要问题。程序设计中,通过函数定义中调用函数自身的方式来实现递归。 数学上有个经典的递归例子叫阶乘,阶乘通常定义为: n!=n∗(n−1)∗(n−2)...∗2∗1n! = n *(n-1)* (n-2)... *2* 1 n!=n∗(n−1)∗(n−2)...∗2∗1 这个关系给出了另一种方式表达阶乘的方式: n!={1n=0n∗(n−1)!n>0n! = \begin{cases} 1 & \text{n=0} \\ n*(n-1)! & \text{n>0} \end{cases} n!={1n∗(n−1)!n=0n>0 阶乘的例子揭示了递归的2个关键特征: 存在一个或多个基例,基例不需要再次递归,它是确定的表达式; 所有递归链要以一个或多个基例结尾。 根据用户输入的整数 n, 计算 ...
学习笔记
未读lambda 函数定义 Python 中提供了一项非常有用的功能:利用 lambda 函数来替代 def, 创建一个临时简单函数。 请注意, 与 def 语句不同,lambda 是一个表达式。 这就使得 lambda 能够出现在函数调用的参数中。而 def 语句则不能作为参数传递给函数。 1lambda <args>: <expression> lambda表达式创建一个函数,它会返回函数本身。 这也是lambda被称为匿名函数的原因,它本身是没有名称的。如果需要在后面代码中使用该匿名函数,也可以将它赋值给一个变量。这个变量的类型就是一个函数。 123getSecondItem = lambda x: x[1]print(type(getSecondItem))print(getSecondItem(['C','1972'])) 下面列举一些 Python 中经常用到匿名函数的场景。 应用一:列表排序 对于列表的sort()方法,可以通过key来传入一个函数,sort()方法将利用这个函数对列表每个元素的返回结果来排序。 ...
学习笔记
未读变量作用域 Python 中规定每个变量都有它的作用域, 即变量只有在作用域范围内才是可见可用的。 作用域能避免程序代码中的名称冲突,在一个函数中定义的变量名称不会干扰另外一个函数内的变量。这有助于使函数更加独立。 根据作用域范围的大小,可以将作用域分为全局作用域和局部作用域。 局部变量 局部变量仅仅在局部作用域内可用。在局部作用域之外,该变量是不可见的。 如果变量是在函数体内被创建(首次赋值)的,这个变量就只能在该函数体内使用,是这个函数体的局部变量。 函数执行结束后, 局部变量被销毁。函数的参数作为一类特殊的变量,是在函数调用时首先被创建并赋值的。参数也是局部变量。 12345def avg(x, y): avg_price = (x + y) / 2 print(avg_price)avg(10.0, 20.0)print(avg_price) 下图中的白色区域即为函数的局部作用域, 在这个局部作用域内创建的局部变量x、y和avg_price仅在白色区域可用。 全局变量 相对于局部变量,在所有函数之外创建的变量,在整个文件范围内都是可见的。也就是说,在所有 def ...
定义和调用函数 Python 中使用def语句创建函数,其一般的格式如下所示: 12def name(arg1, arg2, ...,argN): statements 下面这段代码定义了一个简单函数。 123def repeator(s, n): result = s * n print(result) 这段代码仅仅是对函数的定义,并没有调用执行。这条定义语句运行后会新建一个名为repeator的变量名,其类型为function,即函数。 12345def repeator(s, n): result = s * n print(result)print(type(repeator))# <class 'function'> 与内置函数一样,定义完函数后,可以通过函数名调用执行。 12345def repeator(s, n): result = s * n print(result)repeator('嗷', 3)# 嗷嗷嗷 在很多情况下,函数需要将计算的结果返回到调用处。在这类函数的函 ...
集合及基本操作 集合类型与数学中集合的概念是一致的。它是由 0 个或多个唯一的、不可变的元素构成的无序组合。和字典一样,集合也是通过一对花括号{}来标识的。 集合中的元素是不可重复的, 常常用于检查某个元素是否存在。 集合的元素不能是可变类型,例如列表、字典或者集合本身。 虽然集合中的元素必须是不可变类型,但是集合本身是可变的,可以添加、删除和清空集合元素。 创建集合 可以使用set()函数创建一个集合, 或者用花括号将一系列以逗号隔开的元素包裹起来创建。 12language = set(['C', 'C++', 'Java', 'Python'])print(language) 在 Python 中使用{}创建的是空字典, 而不是空集合。 创建空集合应该使用set()函数。 1print(type({})) 利用集合去重 集合的重要特征之一就是元素不重复。 因此, 当使用set()函数将其他可迭代对象转换为集合时,该函数会自动过滤掉重复元素。 ...
字典及基本操作 在 Python 中, 字典通过特定的键(key),查找对应的值(value)。键和值之间是一一对应的映射关系。字典是 Python 中唯一内置的、核心的映射类型。 字典通过一对花括号 {}来 标识。 字典与列表、元组不同, 其每个元素由键和值两个部分构成, 键和值之间用冒号 :隔开。不同键值对使用逗号隔开。 1{<键1>:<值1>, <键2>:<值2>, … , <键n>:<值n>} 相对于列表和元组,字典有以下一些属性: 字典是无序的。 字典是可变的。 字典的键必须是不可变类型。 字典的键不能重复。 通过键而不是索引序号来获取值。 创建字典 字典可以通过一对花括号{}或者dict函数来创建。 12dic = {'C':'1972', 'C++':'1979', 'Java':'1995', 'P ...
学习笔记
未读while 循环语句 Python 中有 while 和 for 两种循环结构,利用循环语句,可以让一个代码块一遍又一遍的执行。 对于while循环,只要while语句的条件为True,while子句中的代码就会执行。Python当中,while实现循环的方法如下: 12while condition: statements while语句看起来和if语句类似。不同之处是它们的行为。if子句结束时,程序继续执行if语句之后的语句。但在while子句结束时,程序执行跳回到while语句开始处。while子句常被称为“while 循环”,或就是“循环”。 代码实例: 123count = 0while count < 10: print(f'{count}的平方为{count ** 2}') for 循环语句 通常,for循环用于遍历序列(字符 串、列表和元组等)或任何可迭代对象内的元素,是一个通用的迭代器。for循环的一般形式是: 12for item in iterable_obj: statem ...
学习笔记
未读语句和代码块 程序是由语句和表达式构成的。 还有一些语句不仅仅由一行代码构成,例如分支和循环语句,在选择不同的分支或者 循环条件满足的情况下,有时需要执行多行代码。这样的语句称为复合语句。 缩进的作用 在 Python 中, 要求使用缩进来标识代码块。 相同层级的代码必须以垂直对齐的方式来组织, 即相同的缩进。 一些代码行可以作为一组,放在“代码块”中可以根据代码行的缩进,知道代码块的开始和结束。代码块有3 条规则。 缩进增加时,代码块开始。 代码块可以包含其他代码块。 缩进减少为零,或减少为外面包围代码块的缩进,代码块就结束了。 Python语言采用严格的“缩进”来表明程序的格式框架。缩进指每一行代码开始前的空白区域,用来表示代码之间的包含和层次关系。 Python 对于缩进的数量没有严格规定,比较常见的是使用 4 个空格或者 1 个制表符。但最好不要在同一段代码中混合使用空格和制表符,这样可能会引起语法错误。 Python 的复合语句首行总是使用冒号:结尾。输入冒号后回车,新的代码行将自动缩进,以便于输入代码块中的语句。 12首行语句: 内嵌代码块 条件表达式 控制语 ...
引入 正则表达式是一种描绘字符串的匹配模式,可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。 比如我们可以使用以下正则表达式来匹配一个网址: 1[a-zA-Z]+://[^\s]* 其中a-z表示匹配任意的小写字母,A-Z表示匹配任意的大写字母,^\s表示匹配任意的非空白字符,*表示匹配前面的任意多个字符。 本文将介绍正则表达式的基本概念,以及如何使用 Python 的re库进行正则匹配。 常用匹配规则 除了我们上一节说到的几个匹配规则之外,正则表达式还提供了很多的匹配规则,下表列出了常用的一些匹配规则: 模式 描述 \w 匹配字母、数字及下划线 \W 匹配不是宇母、数字及下划线的字符 \s 匹配任意空白字符,等价于[\t\n\r\f] \S 匹配任意非空字符 \d 匹配任意数字,等价于[0-9] \D 匹配任意非数字的字符 \A 匹配字符串开头 \Z 匹配字符串结尾。加果存在换行,只匹配到换行前的结束字符串 \z 匹配字符串结尾。如果存在换行,同时还会匹配换行符 \G 匹配最后匹配 ...
引言 除了两个方面,元组数据类型几乎与列表数据类型一样。 用圆括号()表示 首先,元组输入时用圆括号(),而不是用方括号[]: 12tp = ('Python', 'Java', 'C')print(tp) 不可变 元组与列表的主要区别还在于,元组像字符串一样,是不可变的。元组不能让它们的值被修改、添加或删除: 12tp = ('Python', 'Java', 'C')tp[1] = 'C++' 如果元组中只有一个值,你可以在括号内该值的后面跟上一个逗号,表明这种情况。否则,Python 将认为,你只是在一个普通括号内输入了一个值。逗号告诉 Python,这是一个元组(不像其他编程语言,Python 接受列表或元组中最后表项后面跟的逗号)。 1234a = ('Python')print(type(a))b = ('Python',)print(type(b)) 利用你可以用元组告诉所有读代码的人,你不打 ...