09 | 不可或缺的自定义函数
该思维导图由 AI 生成,仅供参考
函数基础
- 深入了解
- 翻译
- 解释
- 总结
Python中的自定义函数是编写模块化、规范化代码的不可或缺的一部分。本文介绍了函数的基础知识,包括函数的定义、参数传递、返回值等。通过示例演示了如何定义和调用函数,以及函数的嵌套和参数默认值的使用。文章还强调了Python的动态类型和多态特性,以及函数嵌套对内部数据的隐私保护和程序运行效率的提升作用。总之,自定义函数在Python编程中具有重要意义,能够提高代码的可读性和可维护性,同时也展现了Python语言的灵活性和便利性。 此外,文章还介绍了Python函数中变量的作用域,包括局部变量和全局变量的定义和使用,以及在函数内部改变全局变量值的方法。另外,闭包的概念也得到了详细解释,强调了闭包的简洁性和可读性,以及与嵌套函数相比的优势。 总的来说,本文通过深入浅出的方式,全面介绍了Python函数的概念及其应用,包括参数类型、默认值、作用域、嵌套函数和闭包等内容。读者可以从中了解到Python函数的灵活性和强大功能,以及如何利用这些特性编写高效、可维护的代码。文章还提出了思考题,鼓励读者分享自己在实际工作中遇到的嵌套函数或闭包的例子,促进交流和学习。 总体而言,本文内容丰富、深入浅出,适合Python初学者和有一定基础的开发者阅读,能够帮助他们更好地理解和应用Python函数的相关知识。
《Python 核心技术与实战》,新⼈⾸单¥59
全部留言(78)
- 最新
- 精选
- William快排封装,增加index参数会用到嵌套。 ```python def quickSort(arr): def partition(arr, left, right): pivot = arr[left] while left < right: while left < right and arr[right] > pivot: right -= 1 if left < right: arr[left] = arr[right] while left < right and arr[left] < pivot: left += 1 if left < right: arr[right] = arr[left] arr[left] = pivot return left def innerQuickSort(arr, left, right): stack = [] stack.append(left) stack.append(right) while len(stack) > 0: right = stack.pop() left = stack.pop() pivotIndex = partition(arr, left, right) if pivotIndex + 1 < right: stack.append(pivotIndex+1) stack.append(right) if left + 1 < pivotIndex: stack.append(left) stack.append(pivotIndex - 1) innerQuickSort(arr, 0, len(arr)-1) arr = [394, 129, 11, 39, 28] quickSort(arr) print(arr) ```
作者回复: 嗯嗯,学习很细心
2019-05-2910 - Geek_7777闭包,调用square(2),这个参数2为啥能传给base,不太懂请教下
作者回复: 因为这里square=nth_power(2)已经是一个函数了,这个函数有两个参数,已经接受了exponent,因此如果你调用了square(2),这个参数会再传给base,这样就能输出结果了
2020-02-1636 - Vincent关于嵌套函数:“我们只能通过调用外部函数 connect_DB() 来访问它,这样一来,程序的安全性便有了很大的提高。” 这个怎么就安全了呢?这个安全指的是什么安全呢?
作者回复: 数据库的用户名密码等一些信息不会暴露在外部的API中
2019-05-296 - Gfcn没想到连闭包都讲,真的是干货满满,32个赞
作者回复: 谢谢支持
2019-09-305 - 路伴友行顺便我想多问一句,在Python里是不推荐使用递归的,是因为Python没有对递归做优化,那使用 yield from 来代替递归会不会好些呢? 其实我上一个例子就是一个尝试,我之前只尝试过打印栈信息,只看到有2层,就是不清楚有些其他什么弊端。
作者回复: 你说的没错
2019-05-295 - JOKERBAI老师,您说的“函数的调用和声明哪个在前哪个在后是无所谓的。”请问这句话怎么理解呢? 如下是会报异常NameError: name 'f' is not defined: f() def f(): print("test")
作者回复: 文中已经更新了。可能之前表达的不准确,意思是主程序调用函数时,必须保证这个函数此前已经定义过,但是,如果我们在函数内部调用其他函数,函数间哪个声明在前、哪个在后就无所谓,因为def是可执行语句,函数调用前都不存在,我们只需保证调用时,所需的函数都已经声明定义
2019-05-2945 - SCAR老师函数嵌套的作用二的例子,如果是在大量的调用函数时,可能还是分开检查和递归比较好,因为嵌套内函数是函数的一个local变量,在大量调用函数的时候,local变量是不断产生和销毁的,这会非常费时间,它可能会反噬掉一次类型检查节省下来的时间。看下面我贴出的计算1百万次100阶乘的时间,所以还是要根据具体情况来定,当然大部分时候函数不会这么大量调用。 def factorial(input): # validation check if not isinstance(input, int): raise Exception('input must be an integer.') if input < 0: raise Exception('input must be greater or equal to 0' ) ... def inner_factorial(input): if input <= 1: return 1 return input * inner_factorial(input-1) return inner_factorial(input) def factorial_1(input): # validation check if not isinstance(input, int): raise Exception('input must be an integer.') if input < 0: raise Exception('input must be greater or equal to 0' ) def inner_factorial_1(input): if input <= 1: return 1 return input*inner_factorial_1(input-1) %%time for i in range(1000000): factorial(100) CPU times: user 21.6 s, sys: 11.6 ms, total: 21.6 s Wall time: 21.7 s %%time for i in range(1000000): factorial_1(100) inner_factorial_1(100) CPU times: user 19.7 s, sys: 12 ms, total: 19.7 s Wall time: 19.7 s
作者回复: 这个case by case,需要注意的是有些时候一些validation check的cost很高,比如机器学习里面我们会对训练数据(>= 1000 million的样本)做一些统计等等
2019-05-292 - MickeyWpython里的闭包也会跟javaScript里的闭包一样,有内存得不到释放的问题么?
作者回复: 有可能,stackoverflow上有相关的讨论:https://stackoverflow.com/questions/2017381/is-it-possible-to-have-an-actual-memory-leak-in-python-because-of-your-code
2019-12-281 - Geek_5c241cMIN_VALUE = 1 MAX_VALUE = 10 def validation_check(value): MIN_VALUE = 3 validation_check(1) print(MIN_VALUE) 仍然是1而不是文章里面说的3,是不是弄错了?
作者回复: 你仔细看文章,文章里说的是函数内部的MIN_VALUE是3,因为函数内部局部变量覆盖了全局变量。 你如果如果在函数外部打印当然是1。
2019-05-291 - rogerr连接数据库的密码信息虽然在嵌套的函数里,但对于脚本来说还是明文的
作者回复: 我这里只是举例说明。实际会做hash,或者通过token之类的其他方式访问
2019-05-291