Day3 - Python基础3 函数基本、递归函数、内置函数
本节内容
1. 函数基本语法及特性
2. 参数与局部变量
2.2. 函数变量作用域
3. 返回值
嵌套函数
4.递归
5.匿名函数
6.函数式编程介绍
7.高阶函数
8.内置函数
1. 函数基本语法及特性
函数是什么?
函数的英文 function()功能的意思。(即一般一个函数实现一个功能)
函数的作用:
1.减少重复代码
2.方便修改,更易扩展
3.保持代码的一致性
函数语法定义:
def 函数名(形参): ...
函数体
...
返回值 函数名(实参)
---------我是分割线-------
def add(a,b)
c = a+b
return c add(12+34)
2. 参数与局部变量
形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量;
实参可以是常量、变量、表达式、函数等,无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。因此应预先用赋值,输入等办法使参数获得确定值;
形参的种类3种:
#def test(a,b,c=3):
# print(a,b,c) #普通参数,必须一一对应,缺一不行多一也不行
# test(1,2,3) #默认参数,无须一一对应,缺一不行多一也不行
# test(y=1,x=3,z=4) 注意:默认参数必须在关键字参数左边,传入则覆盖,不传则是默认c=3
#test(1,2) -----------分割线---------------------
##可变参数 *args 变成了() **kwargs 变成了{} def test(a,*args,**kwargs):
print(a) ##1
print(args,args[1]) ##(2, 4, 3) 4
print(kwargs,kwargs.get('y')) ##{'c': 45, 'y': 23} 23 ##第一种实参传入
#test(1,2,4,3,y=23,c=45) ##第二种实参传入,*l1 和 **d1 叫做分解参数,变成第一种参数传入的方式
l1 = [2,4,3]
d1 = {'y':23,'c':45}
test(1,*l1,**d1)
局部变量:LEGB原则
name = "Alex Li" def change_name(name):
print("before change:",name)
name = "金角大王,一个有Tesla的男人"
print("after change", name) change_name(name) print("在外面看看name改了么?",name) 输出:
before change: Alex Li
after change 金角大王,一个有Tesla的男人
在外面看看name改了么? Alex Li
全局与局部变量:
在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量。
全局变量作用域是整个程序,局部变量作用域是定义该变量的子程序。
当全局变量与局部变量同名时:
在定义局部变量的子程序内,局部变量起作用;在其它地方全局变量起作用。
2.2 函数变量作用域 LEGB原则
LEGB是指python中命名空间的四个从低到高不同的层次,分别是Local , Enclosing , Global , Built-in。local指一个函数或者方法的内部的空间,enclosing指的是闭包内部空间,global是整个脚本的全局空间,而built-in是指python最上层的系统自带的一些名字的空间。
因为python可以提供这么多不同层次的命名空间,所以当我们在程序中写下一个变量名的时候,解释器就会通过一定的顺序来查找这个变量名的具体内容。这个顺序显然就是local --> enclosing --> global --> built-in。如果按照此顺序逐级而上却没有找到相关的变量名的内容的话就表明这个变量名在哪一级命名空间中都不存在,程序就会raise起一个NameError了。
name = 'crik' #G def func():
name = 'crik2' #E
def outer(): #L
name = 'crik3'
print(name)
print(name)
outer() print(name)
func() 输出:
crik
crik2
crik3
3. 返回值
return的作用
1:结束函数 2:返回某个对象 这个对象可以是任意的!
1 def add(*args):
2 sum = 0
3 for i in args:
4 sum += i
5 print(sum)
6 # return sum
7
8 a = add(1,3)
9 print(a)
结果:
4 注意:这里的4是函数的print的,一般来说;调用函数后要保存下来结果是吧?
None 而你没有return语句,那么就回默认返回一个None:所以一定要记得return
强行插入知识点: 嵌套函数
def outer():
print('outer')
def inner():
print('inner')
return inner ##这里return的是inner的内存地址,所以需要再次的调用,
##要是没有return inner的话,print('inner')永远不会被输出,因为别人调用不到! q = outer()
q() ##再次调用
4.递归
在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
def fb(a,b):
if a == 0 and b ==1:
print(a)
if b >300:
return
else:
print(b)
a,b = b,a+b
return fb(a,b) fb(0,1) 输出:
0
1
1
2
3
5
8
13
21
34
55
5.匿名函数
匿名函数的作用:
1:省空间 (定义了函数,而里面的函数体一直等着别人去引用【一直在内存里面呆着】,而匿名则是用一次,就自动消除了)
2:没有函数名
知识点:定义个 name = 'crik' 我们说name这个变量指向了 ‘crik’这个的内存地址,而我们也可以把函数名等同与指向了函数体的内存地址的变量!
#这段代码
def calc(n):
return n**n
print(calc(10)) #换成匿名函数
calc = lambda n:n**n
print(calc(10))
你也许会说,用上这个东西没感觉有毛方便呀, 。。。。呵呵,如果是这么用,确实没毛线,改进,不过匿名函数主要是和其它函数搭配使用的呢,如下
res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
print(i)
输出
1
25
49
16
64
6.函数式编程介绍
7.高阶函数
变量可以指向函数,函数的参数能接收变量:那么一个函数就可以接收另一个函数作为参数:这种函数就称之为高阶函数。
def add(x,y,f): return f(x) + f(y) #abs是一个内置的函数
res = add(3,-6,abs)
print(res)
8. 内置参数
内置函数eval
内置函数:eval
>>> s = input('plz input something:') ##input输入默认是字符串的
plz input something:[,,,]
>>> s
'[1,2,3,4]'
>>> s.[]
SyntaxError: invalid syntax
>>> s = eval(s) ##把字符串当中的数据结构提取出来
>>> s[] >>>
>>> eval('1-23-4-5') ##还能把字符串当中的表达式给你执行下
-
>>>
内置函数isinstance、issubclass
isinstance(obj,cls)检查是否obj是否是类 cls 的对象
class Foo(object):
pass obj = Foo() isinstance(obj, Foo) ##输入 True issubclass(sub, super)检查sub类是否是 super 类的派生类
class Foo(object):
pass class Bar(Foo):
pass issubclass(Bar, Foo) ##输出True
内置函数zip
>>> v = [(,'qwq'),(,'rt'),(,'yu')] ##有这个一组列表,我想要获取[,,]的格式
>>> zip(*v)
<zip object at 0x00000000028EF608> ##默认python3 zip之后生成迭代器
>>> list(zip(*v)) ##采用list迭代出来
[(, , ), ('qwq', 'rt', 'yu')]
>>> list(zip(*v))[]
(, , )
>>>
内置函数ord、chr、bin
###输出字符在ASCII码中的位置
>>> ord('A') >>> ord('') ##将数字按ASCII码的位置输出对应的字符
>>> chr()
''
>>> chr()
'A'
>>> >>> bin() ##将数据变成二进制
'0b10111'
内置函数__import__
通过字符串的形式,导入模块。起个别名 ccas。 comm = input("Please:")
ccas = __import__(comm)
ccas.f1() # 需要做拼接导入时后加 fromlist=True(否则只导入lib)
ccas = __import__("lib."+comm, fromlist=True)
:单例模式
内置函数round
>>> round(4.6) ##四舍五入 >>>
内置函数map
map()函数
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,
并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 例如,对于list [, , , , , , , , ] 如果希望把list的每个元素都作平方,就可以用map()函数:
>>> l=[,,,,,,]
>>> result = map(lambda x:x**x,l)
>>> result
<map object at 0x0000000002900240> ##这是个迭代器
>>> list(result) ##可以直接采用list进行遍历
[, , , , , , ] 在后面的Django框架中:
我们可能获取一个values_list的列表元组数据格式,要组成一个字典:这里就简单的做个样子
>>> l=[(,'q'),(,'r'),(,'t')]
>>> result = map(lambda x:{"id":x[],"name":x[]},l)
>>> result
<map object at 0x0000000002900320>
>>> list(result)
[{'id': , 'name': 'q'}, {'id': , 'name': 'r'}, {'id': , 'name': 't'}] 上文的zip函数,复习下。这个也很重要,后面会用到。
>>> l
[(, 'q'), (, 'r'), (, 't')]
>>> list(zip(*l))
[(, , ), ('q', 'r', 't')]
>>> list(zip(*l))[]
(, , )
>>>
练习:4个随机字符串 由数字和大小写组成
import random num_0 = ord('0')
num_9 = ord('9')
num_a = ord('a')
num_z = ord('z')
num_A = ord('A')
num_Z = ord('Z') n = 0
chat = ''
while n <4:
##ascii 是 0-256个
i = random.randrange(0,256)
if i in range(num_0,num_9+1): ##默认range顾头不顾尾
temp = chr(i) ##如果是0-9的ascii对应的数字,就转为字符 相加
chat += temp
n +=1 #n+1 用于判断什么时候退出循环
elif i in range(num_A,num_Z+1):
temp = chr(i)
chat += temp
n +=1
elif i in range(num_a,num_z+1):
temp = chr(i)
chat += temp
n +=1
else:
pass
else:
print('generate success...') print(chat) 输出:67Az
Day3 - Python基础3 函数基本、递归函数、内置函数的更多相关文章
- python基础(14)-反射&类的内置函数
反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...
- python基础7之python3的内置函数
官方介绍: python3:https://docs.python.org/3/library/functions.html?highlight=built#ascii python2:https:/ ...
- Python基础(二)——常用内置函数
1. 常用内置函数 (1)isinstance(object, classinfo) 用于判断一个对象是否为某一类型. object 是实例对象 classinfo 是基本类型如 int, floa ...
- python基础--迭代器、生成器、内置函数、面向对象编程
迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...
- Python基础(10)_内置函数、匿名函数、递归
一.内置函数 1.数学运算类 abs:求数值的绝对值 divmod:返回两个数值的商和余数,可用于计算页面数 >>> divmod(5,2) (2, 1) max:返回可迭代对象中的 ...
- Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...
- python 函数 装饰器 内置函数
函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...
- 生成器的send方法、递推函数、匿名函数及常用内置函数
生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 什么是send方法? send方法相当于高级的next方法,send ...
- 14 python初学(高阶函数 递归函数 内置函数)
高阶函数:1. 函数名是一个变量,函数名可以进行赋值 2. 函数名可以作为函数参数,还可以作为函数返回值(函数名称作为函数返回值时返回的是:函数的地址:print 这个返回值的调用相当于执行这个函数 ...
- python语言(四)关键字参数、内置函数、导入第三方模块、OS模块、时间模块
一.可变参数 定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以).此时,可用包裹(packing)位置参数(*args),或者包裹关键字参数(**kwargs),来进行参数传递,会 ...
随机推荐
- html中的a标签详解
事故起源于一个魔鬼测试人员,某天做网站UI优化的时候,突然甩了一个问题给我 第二列的数据是可以跳转至其他页面的,但是,魔鬼测试的电脑上,一直都有一条数据是与其他的样式不同,于是便甩了这个问题给我,我一 ...
- iOS AOP实战
AOP: 面向切面编程,偏向于处理业务的某个阶段 适用场景: 1. 参数校验:网络请求前的参数校验,返回数据的格式校验等等 2. 无痕埋点:统一处理埋点,降低代码耦合度 3. 页面统计:帮助统计页面访 ...
- CSS3 更改字体被选中样式
CSS3 更改字体被选中样式
- python总结【来自Runoob】
test.py #!/usr/bin/python print "Hello, Python!"; $ chmod +x test.py # 脚本文件添加可执行权限 $ ./tes ...
- linux安装数据时报错Could not execute auto check for display colors using command /usr/bin/xdpyinfo.
在redhat6.5上安装Oracle时,最后使用oracle用户执行runInstaller 报错如下,无法连接到安装有xmanager的windows服务器,也就无法图形化安装oracle ora ...
- PHP Loser 说说做前端需要如何进一步学习
PHP Loser 说说做前端需要如何进一步学习 做前端的,需要如何进一步学习?书籍这个事情贵精不在多,我这里推荐两本即可: <javascript教程 高级程序设计> <CSS权威 ...
- 表单生成器(Form Builder)之伪造表单数据番外篇——随机车辆牌照
前几天记录了一下表单生成器(Form Builder)之表单数据存储结构mongodb篇,之后便想着伪造一些数据.为什么要伪造数据呢?说来惭愧,因为拖拉拽设计表单以及表单对应的列表的PC端和移动端该显 ...
- 《软件安装》VMware 安装 centos8
上期问题回顾 搞技术的同学应该都听过docker,那么请问docker和虚拟机有什么区别呢? 传统的虚拟机架构是:物理机 -> 宿主机操作系统 -> Hypervisor支持 -> ...
- 苹果 macOS 安装 Source Code Pro
1. 下载 到 Source Code Pro 的 GitHub 官网下载:https://github.com/adobe-fonts/source-code-pro 点击 GitHub 中 ...
- [考试反思]1112csp-s模拟测试111:二重
还是AK场.考前信心赛? 而且T3的部分分还放反了所有80的都其实只有50. 总算在AK场真正AK了一次... 手感好,整场考试很顺利.要不是因为T3是原题可能就没这么好看了. 20minT1,50m ...