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),来进行参数传递,会 ...
随机推荐
- Java之封装与访问权限控制(一)
目录 Java之封装与访问权限控制(一) 封装的概念 访问控制符 属性私有化 Java之封装与访问权限控制(一) 对于封装的概念,我总觉得自己还是挺了解的,但是真要我说,还真说不出个啥来.我只能默默地 ...
- 计算几何 val.3
目录 计算几何 val.3 自适应辛普森法 定积分 引入 辛普森公式 处理精度 代码实现 模板 时间复杂度 练习 闵可夫斯基和 Pick定理 结论 例题 后记 计算几何 val.3 自适应辛普森法 可 ...
- xml-mapping xml 与 java 对象转换映射框架,像 XStream 一样优雅地读写xml
xml xml 是 java 实现的 xml 框架. 希望以最优雅的方式进行 xml 和 java 之间的转换处理,一行代码搞定一切. 特点 对象的和 xml 的互相映射 支持注解 @Alias 指定 ...
- React 基础笔记
概览 React 是一个声明式,高效且灵活的用于构建用户界面的 JavaScript库.可以将一些简短.独立的代码片段组合成复杂的UI界面,这些片段被称为"组件". React 大 ...
- 一步一步创建聊天程序2-利用epoll来创建简单的聊天室
如图,这个是看视频时,最后的作业,除了客户端未使用select实现外,其它的要求都有简单实现. 服务端代码如下: #include <stdio.h> #include <strin ...
- leetcode题解:两数之和
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元 ...
- Python:requests库、BeautifulSoup4库的基本使用(实现简单的网络爬虫)
Python:requests库.BeautifulSoup4库的基本使用(实现简单的网络爬虫) 一.requests库的基本使用 requests是python语言编写的简单易用的HTTP库,使用起 ...
- Python集合类型的操作与应用
Python集合类型的操作与应用 一.Python集合类型 Python中的集合类型是一个包含0个或多个数据项的无序的.不重复的数据组合,其中,元素类型只能是固定数据类型,如整数.浮点数.字符串.元组 ...
- 云数据库MongoDB版清理oplog日志和compact命令详解
1.问题描述: 今天看到公司mongodb的oplog有点大,看到云数据库MongoDB版日志清理策略. MongoDB数据库在长期频繁地删除/写入数据或批量删除了大量数据,将产生很多物理空间碎片. ...
- Python time.time()方法
描述 Python time time()返回当前时间的时间戳. 时间戳:时间戳是指格林威治时间1970年01月01日00时00分00秒(背景时间1970年01月01日08时00分00秒)起至现在的总 ...