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),来进行参数传递,会 ...
随机推荐
- Python高级特性——切片(Slice)
摘录廖雪峰网站 定义一个list: L = ['haha','xixi','hehe','heihei','gaga'] 取其前三个元素: >>> L[0],L[1],L[2] (' ...
- Consul初探-从安装到运行
前言 伟大领袖毛主席说过:实践是检验真理的唯一标准!经过上一篇的学习,我基本掌握了 Consul 的基本原理,接下来就是动手实践了:Consul 的部署方式分为两种,分别是二进制包和docker方式, ...
- Python, import, module
When the interpreter reads a python script file, it does two things: (1) set some special variable. ...
- JavaScript 日期格式
有四种 JavaScript 日期输入格式: 类型 实例 ISO 日期 "2018-02-19" (国际标准) 短日期 "02/19/2018" 或者 &quo ...
- js自带的对数组中的操作
这篇是我自己总结的,是我自己平常使用的不是很多的数组方法,而且都是js自带的,像大家经常使用的push.pop方法就没写里面.废话不多说,直接看代码 <!DOCTYPE html> < ...
- 当Python遇上AI(一)
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.什么是学习 如果要给学习下一个定义,那么根据某百科给出的定义是——学习,是指通过阅读.听讲.思考和实践等途径获 ...
- MySQL 重置Mysql root用户账号密码
重置Mysql root用户账号密码 By:授客 QQ:1033553122 问题描述: 使用mysqladmin.exe执行命令时出现以下错误提示: mysqladmin: connect to ...
- 表单生成器(Form Builder)之伪造表单数据番外篇——指定范围随机时间
为了伪造一些尽量真实的假数据,也真是够费劲的.上一篇笔记记录了一下获取一个随机车辆牌照,这篇笔记记录一下怎么获取一个随机时间.这篇就不说那么多废话了,直接上代码 // 获取指定范围的随机数 var g ...
- python-参数化-(1)(手机号码)
一.生成手机号码,此处并没有写成类或者函数形式,上代码 import random #指定手机号码前三位格式,并随机返回一个区号,关于random参数化的相关部分自行了解type_mobile = [ ...
- 花了三个月终于把所有的 Python 库全部整理了!可以说很全面了
库名称简介 Chardet字符编码探测器,可以自动检测文本.网页.xml的编码. colorama主要用来给文本添加各种颜色,并且非常简单易用. Prettytable主要用于在终端或浏览器端构建格式 ...