本节内容

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 函数基本、递归函数、内置函数的更多相关文章

  1. python基础(14)-反射&类的内置函数

    反射 几个反射相关的函数可参考python基础(10)-匿名函数&内置函数中2.2.4反射相关 类的一些内置函数 __str__()&__repr__() 重写__str__()函数类 ...

  2. python基础7之python3的内置函数

    官方介绍: python3:https://docs.python.org/3/library/functions.html?highlight=built#ascii python2:https:/ ...

  3. Python基础(二)——常用内置函数

    1. 常用内置函数 (1)isinstance(object, classinfo) 用于判断一个对象是否为某一类型. object  是实例对象 classinfo 是基本类型如 int, floa ...

  4. python基础--迭代器、生成器、内置函数、面向对象编程

    迭代器:迭代器对象从集合的第一个元素开始访问,直到所有的元素都被访问完结束.迭代器只能往前不会后退 迭代:更新换代(重复)的过程,每次的迭代都必须基于上一次的结果 迭代器:迭代取值的工具 使用迭代器的 ...

  5. Python基础(10)_内置函数、匿名函数、递归

    一.内置函数 1.数学运算类 abs:求数值的绝对值 divmod:返回两个数值的商和余数,可用于计算页面数 >>> divmod(5,2) (2, 1) max:返回可迭代对象中的 ...

  6. Python中字符串String的基本内置函数与过滤字符模块函数的基本用法

    Python中字符串String的基本内置函数与用法 首先我们要明白在python中当字符编码为:UTF-8时,中文在字符串中的占位为3个字节,其余字符为一个字节 下面就直接介绍几种python中字符 ...

  7. python 函数 装饰器 内置函数

    函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...

  8. 生成器的send方法、递推函数、匿名函数及常用内置函数

    生成器的send方法 在使用yield方法创建生成器时,不仅可以使用next方法进行取值,还可以通过send方法向生成器的内部传值 什么是send方法? send方法相当于高级的next方法,send ...

  9. 14 python初学(高阶函数 递归函数 内置函数)

    高阶函数:1.  函数名是一个变量,函数名可以进行赋值 2. 函数名可以作为函数参数,还可以作为函数返回值(函数名称作为函数返回值时返回的是:函数的地址:print 这个返回值的调用相当于执行这个函数 ...

  10. python语言(四)关键字参数、内置函数、导入第三方模块、OS模块、时间模块

    一.可变参数 定义函数时,有时候我们不确定调用的时候会传递多少个参数(不传参也可以).此时,可用包裹(packing)位置参数(*args),或者包裹关键字参数(**kwargs),来进行参数传递,会 ...

随机推荐

  1. Spring Boot2解决idea console 控制台输出乱码

    Idea默认配置是采用GBK, 而项目工程文件采用的是UTF-8. 编码不一致,导致idea Console控制台输出乱码. 网上的解决方案,大都是直接修改Settings=>Editor=&g ...

  2. 基于canvas线条绘制图形

    原理说明 绘制一个正方形,正放心每条边等比例均分,具体分配多少根据自身情况而定,按照最上边边顺时针方向依次绘制线条,相邻两条边上的点依次连接,知道所有的点全部连接完便绘制完成. 示例效果图图如下 具体 ...

  3. vue常见问题处理 -- 页面刷新时,如何保持原有vuex中的state信息

    一.页面刷新时,如何保持原有vuex中的state信息 页面刷新后,原有的 vuex 中的 state 会发生改变,如果在页面刷新之前,可以将 state 信息保存,页面重新加载时,再将该值赋给 st ...

  4. Hello universe!

    Hello, universe. This is my first cnblogs article.this blog apply to computer technology and another ...

  5. RunLoop 和 autoreleasepool

    RunLoop 和 autoreleasepool RunLoop和线程的一一对应的,对应的方式是以key-value的方式保存在一个全局字典中 主线程的RunLoop会在初始化全局字典时创建 子线程 ...

  6. LeetCode刷题191121

    博主渣渣一枚,刷刷leetcode给自己瞅瞅,大神们由更好方法还望不吝赐教.题目及解法来自于力扣(LeetCode),传送门. 数据库: 编写一个 SQL 查询,来删除 Person 表中所有重复的电 ...

  7. Zabbix-3.4简介及安装配置

    一.概述 1.为什么选择Zabbix? Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件.Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警.这样可以快速反馈 ...

  8. SQLSERVER预读逻辑读物理读

    预读:用估计信息,去硬盘读取数据到缓存.预读100次,也就是估计将要从硬盘中读取了100页数据到缓存. 物理读:查询计划生成好以后,如果缓存缺少所需要的数据,让缓存再次去读硬盘.物理读10页,从硬盘中 ...

  9. 不能绑定到端口号:9194原因:Cannot assign requested address: JVM_Bind

    晚上将老服务器程序从win2008部署在新的云服务器win2012上,其实就是复制过去改改配置,启动时突然报不能绑定到端口号:9194原因:Cannot assign requested addres ...

  10. Tornado—三种启动tornado的方式

    第一种启动方式:单进程 import tornado.web # web服务 import tornado.ioloop # I/O 时间循环 class Mainhandler(tornado.we ...