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),来进行参数传递,会 ...
随机推荐
- 5.java基础之static、类加载过程
static修饰符 修饰属性:静态的属性不属于任何对象,全类及其对象共用,可以用类名直接调用 修饰方法:静态的方法可以直接用类名调用,和对象无关.静态方法只能访问静态成员和静态方法,非静态方法可以调用 ...
- 天下代码一大抄,整个案例的搬是什么鬼!疑似冒充蚂蚁金服高级Java开发工程师?你大爷
写在开始 上班前的第一件事,就是码云看看有什么消息,回复下网友的问题.如果看到喜欢的项目会点进去瞅瞅,然后就开始一天的工作. 然而,这一天的工作并不开心,一个今日热门项目让自己很恼火,一开始感觉并没有 ...
- 版本控制工具——Git常用操作
本文引自:https://juejin.im/post/5c206f1bf265da615114c15a
- java核心API
---恢复内容开始--- Javase01 day01 关于String: String是不可变对象,java.lang.String使用了final修饰,不能被继承: 字符串一旦创建永远无法改变,但 ...
- 轻松定位CPU飙高问题
以下四步轻松定位CPU飙高问题: ①top pid 查看cpu耗CPU进程 ②top -Hp pid 查看该进程所有线程的运行情况,找到占用 CPU 过高的线程 pid ③ printf %x pid ...
- alluxio 信息索引
最近要使用到 alluxio,发现网上还是有一些文档很是不错,现在通过这篇文章进行索引一下,进行备忘: https://edgedef.com/2017/08/17/alluxio-%E5%B0%8F ...
- 由随机数rand5实现随机数rand7
rand5表示生成随机数1,2,3,4,5 rand7表示生成随机数1,2,3,4,5,6,7 要通过rand5构造rand7现在可能没有什么思路,我们先试着用rand7生成rand5 rand7生成 ...
- WASM 成为 HTML、CSS 与 JS 之后的第 4 门 Web 语言
大家都知道,万维网联盟 W3C 认证的 Web 语言有 HTML.CSS 与 JavaScript,而近日联盟正式宣布 WebAssembly 核心规范(WebAssembly Core Specif ...
- JVM-7-类加载机制
什么是类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构. ...
- 小程序之--动态设置页面标题 wx.setNavigationBarTitle
参考地址 http://www.yilingsj.com/xwzj/2018-11-26/weixin-navigationbartitletext.html 页面最初是[在线教研] 可以在这个页面的 ...