壹拾伍

函数进阶

一、递归

? 函数的递归调用,是一种特殊的嵌套调用,但是在调用一个函数的过程中,直接或者间接的调用了他自身。

? 递归的核心: 递进的时候能够达到一个结果,问题规模越来越小(不一定要真正的达到)。

? 递归函数不断地调用自身,就会很肯能会进入无限调用的死循环。同样是死循环,while循环就会进行下去,而递归调用就会在解释器设定的最大范围停止并报错“超出范围”。这是因为while循环的每次循环都只存在一个内存空间,而递归则是每一次都开辟一个新的空间,旧的空间不消失,这样就会占用大量的内存空间,所以就会强行结束。

? 设置一个条件,能够让最后一次函数调用结束;

1.1 直接调用

? 直接调用指的是:直接在函数内部调用函数自身。

import sys

# 修改递归层数
sys.setrecursionlimit(10000)
def foo(n):
    print('from foo',n)
    foo(n+1)
foo(0)

1.2 间接调用

? 间接调用指的是:不在原函数体内调用函数自身,而是通过其他的方法间接调用函数自身。

def bar():
    print('from bar')
    foo()

def foo():
    print('from foo')
    bar()

bar()

? 递归必须要有两个明确的阶段:

  1. 递推:一层一层递归调用下去,进入下一层递归的问题规模都将会减小
  2. 回溯:递归必须要有一个明确的结束条件,在满足该条件开始一层一层回溯。

    ? 递归的精髓在于通过不断地重复逼近一个最终的结果。

1.3 为什么递归

? 递归的本质就是干重复的活,但是仅仅是普通的重复,我们使用while循环就可以了……

二、内置函数

2.1 常用

  1. bytes
res = '你好'.encode('utf8')
print (res)

b'\xe4\xbd\xa0\xe5\xa5\xbd'
  1. chr()/ord()

? chr()参考ASCII码表将数字转成对应字符;ord()将字符转换成对应的数字。

print(chr(65))
A
print(ord('A'))
65
  1. divmod()

    ? 分栏。

print(divmod(10, 3))
(3, 1)
  1. enumerate()

    ? 带有索引的迭代。

l = ['a', 'b', 'c']
for i in enumerate(l):
    print(i)
(0, 'a')
(1, 'b')
(2, 'c')
  1. eval()

    ? 把字符串翻译成数据类型。

lis = '[1,2,3]'
lis_eval = eval(lis)
print(lis_eval)
[1, 2, 3]
  1. hash()

    ? 是否可哈希。

print(hash(1))
1

2.2 了解

  1. abs()

    ? 求绝对值。

print(abs(-13))  # 求绝对值
13
  1. all()

    ? 可迭代对象内元素全为真,则返回真。

print(all([1, 2, 3, 0]))
print(all([]))
False
True
  1. any()

    ? 可迭代对象中有一元素为真,则为真。

print(any([1, 2, 3, 0]))
print(any([]))
True
False
  1. bin()/oct()/hex()

    ? 二进制、八进制、十六进制转换。

print(bin(17))
print(oct(17))
print(hex(17))
0b10001
0o21
0x11
  1. dir()

    ? 列举出所有time的功能。

import time
print(dir(time))
['_STRUCT_TM_ITEMS', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'altzone', 'asctime', 'clock', 'ctime', 'daylight', 'get_clock_info', 'gmtime', 'localtime', 'mktime', 'monotonic', 'perf_counter', 'process_time', 'sleep', 'strftime', 'strptime', 'struct_time', 'time', 'timezone', 'tzname', 'tzset']
  1. frozenset()

    ? 不可变集合。

s = frozenset({1, 2, 3})
print(s)
frozenset({1, 2, 3})
  1. globals()/loacals()

    ? 查看全局名字;查看局部名字。

# print(globals())
def func():
    a = 1
#     print(globals())
    print(locals())

func()
{'a': 1}
  1. pow()
print(pow(3, 2, 3))  # (3**2)%3
0
  1. round()
print(round(3.5))
4
  1. slice()
lis = ['a', 'b', 'c']
s = slice(1, 4, 1)
print(lis[s])  # print(lis[1:4:1])
['b', 'c']
  1. sum()
print(sum(range(100)))
4950
  1. __import__()

通过字符串导入模块。

m = __import__('time')
print(m.time())
1556607502.334777

? 更多内置函数可以参考:https://docs.python.org/3/library/functions.html?highlight=built#ascii

三、面向过程编程

? 面向过程编程是解决问题的一种思想,它与面向对象编程其实没有好坏之分。

? 面向过程编程,核心是编程二字,过程指的是解决问题的步骤,即先干什么、后干什么、再干什么、然后干什么。

? 基于该思想编写程序就好比在设计一条流水线,面向对称编程其实是一种机械式的思维方式。

? 当我们写登录功能,我们首先需要输入账号、密码,然后认证两次密码是否相同,然后从数据库中读取密码验证用户密码输入是否正确,然后输入验证码……之后,我们就能够实现登录功能。这样把登录功能问题流程化,进而是解决问题的思路非常清晰。

? 特点:上一个过程的输出必定是下一个过程的输入。

? 优点:复杂的问题流程化,进而简单化。

? 缺点:1 功能与功能之间不独立。2. 牵一发而动全身,不方便修改/扩展功能,可扩展性差。

原文地址:https://www.cnblogs.com/tangceng/p/11354765.html

时间: 2024-08-29 18:43:01

壹拾伍的相关文章

【壹拾壹周】final分数分配

组名: 新蜂 组长: 武志远 组员: 宫成荣 谢孝淼 杨柳 李峤 项目名称: java俄罗斯方块NEO 发布时间:12.3 武志远 武志远 武志远 武志远 武志远 宫成荣 宫成荣 杨柳 宫成荣 宫成荣 李峤 杨柳 李峤 谢孝淼 谢孝淼 谢孝淼 李峤 谢孝淼 杨柳 杨柳 杨柳 谢孝淼 宫成荣 李峤 李峤 评分规则参见B-1分数规则,与B-1规则相同,http://www.cnblogs.com/Boxer1994/p/6039442.html. 每名同学占比:武志远:0.26,杨柳:0.20,宫成

【壹拾壹周】评价

礼物挑选小工具: 优点:ui比之前好一些,好像礼物比之前更多了. 缺点:系统是根据用户选择的信息进行推荐的,而这个选择信息太少了,还需进一步细化,比如大家的女朋友都在18-22岁之间,价格区间都是几百块钱,那么如果很多人使用,礼物推荐重复的几率太大了. 食物链教学: 优点:比之前改进了一些微小的地方,比如控制面板默认不出现在屏幕中间,而是右边,这样就不会影响之后相关的操作了. 缺点:新增添的生物是不能进行自动连线的,当然这不是问题,设计就是这样的.但是除了这一点,原生生物跟后加入生物还有个不同,

【壹拾壹周】final_review

项目名:俄罗斯方块 组名:新蜂 组长:武志远 组员:宫成荣 杨柳 谢孝淼 李桥 final Review会议 时间:2016.12.3 会议内容 设想和目标 1.在final阶段发布时的预期目标是什么,期望实现那些功能,具体的实施程度如何? 预期目标:给用户一个surprise,让用户感到excited.final发布与之前的beta相比增加了很多功能,增加了三个功能键,分别是方块瞬间下落,瞄准系统,作弊系统.完善了等级系统. 这些功能大部分被良好的实现了,除了数据库排名系统,本来计划是搞一个全

壹拾贰

函数基础 一.可变长函数 ? 可变长参数:函数在调用时,传入的参数个数不固定 ? 调用函数时,传值有两种方式,一种是位置实参,另一种是关键字实参,因此形参接受传值也需要有两种方法,接收溢出传值的两种方式为位置实参(*)和关键字实参(**). 1.1 可变长形参(*) ? 形参中的 * 会将溢出的位置实参全部接收,然后存储元组的形式,然后把元组赋值给 * 后的参数.需要注意的是:* 后的参数名约定俗成为args. def sum_self(*args): res = 0 for num in ar

壹拾陆

模块基础 一.模块的四种形式 1.1 什么是模块 ? 模块是一系列功能的集合体,因为函数是某一功能的集合体,所以模块可以看作是一系列函数的集合体. ? 一个文件内部有很多的函数,因此一个文件就可以看成是一个模块. ? 一个python文件的名称为XXX.py,那么模块的名称就是XXX. 1.2 模块的四种形式 自定义模块:自己用python写一个有一定功能的文件,就可以称为一个自定义模块. 第三方模块:已经有别人写好的一定功能的模块,使用需要自己安装,目前已有13w+的第三方模块了. 内置模块:

壹拾柒

Python常用模块 一.包 1.1 什么是包 ? 包是一种形式,本质就是一个含有.py文件的文件夹. 1.2 为什么使用包 ? 模块的第一个版本只有10个功能,但是未来在扩展版本的时候,模块名和用法应该最好不要去修改,但是这只是对使用者友好,而由于版本扩展,文件越来越大,模块设计者对模块的管理.维护会越来越复杂,因此我们可以使用包来扩展模块的功能. 1.3 如何使用包 1.3.1 模块和包 ? 导入模块发生的三件事: 创建一个包的名称空间 执行py文件,将执行过程中产生的名字存放于名称空间中.

大写中文数字-財务

壹.贰.叁.肆.伍.陆.柒.捌.玖.拾.佰.仟.万.亿.元(圆).角.分.零.整.这是大家常常要填写的大写数字,问什么要用大写数字呢?想必非常多人都不是非常清楚! 先看看下面两个有关大写数字的表格: 1.数码与大.小写数字的对比表: 数码 小写数字 大写数字 0 ○ 零 1 一 壹 2 二 贰 3 三 叁/參 4 四 肆 5 五 伍 6 六 陆 7 七 柒 8 八 捌 9 九 玖 2.进位数码与大.小写数字的对比表 数码 小写数字 大写数字 10 十 拾 20 二十 廿 30 三十 卅 100

土办法解决日期转换问题,转出格式为。。。 贰零壹陆年零壹月零捌日

/** * 参数名称:@param dateStr 待转换的日期(String格式,结构为yyyy-MM-dd) * 返回值:String 小写汉字的日期 * 方法描述:土办法解决日期转换问题,转出格式为... 贰零壹陆年零壹月零捌日 * @author:zhouzhiwei * 创建时间:2014-5-23 下午05:59:20 */ public static String stringToChineseSmallRMB(String dateStr) { // 传参数的格式为 2011-1

JS常用工具函数(持续记录)

1.设置获取cookie //方式1 //设置cookie function SetCookie(name, value)//两个参数,一个是cookie的名字,一个是值 { var Days = 30; //此 cookie 将被保存 30 天 var exp = new Date(); //new Date("December 31, 9998"); exp.setTime(exp.getTime() + Days * 24 * 60 * 60 * 1000); document.