python第一篇笔记

函数
一:基本概念函数是什么:一个被封装好的具有特定功能的代码段,可以被重复使用。函数名:给封装好的代码段(函数),起个名字。形参:本质上就是一个局部变量,由于接收函数外部的数据,它是定义函数时候定义的。实参:在函数调用执行时,传递的数据。返回值。返回值:将函数中的局部变量传递到函数外部。关键字:return.定义一个函数:①普通函数。②匿名函数(没有函数名的函数)。全局变量:在整个函数中部都可以被调用的变量,一般都是直接定义在函数外部的,或者用 global定义的。(关键字都是在函数内部定义的)局部变量:在函数内部定义的变量,包括形参,只能在函数内部被调用。##注意:(在函数中使用全局变量时,可以调用全局变量的值,不能直接修改全局变量。如果值是可变的类型,值是可以改变的)二:参数的类型位置参数:实参的赋值时和形参定义的顺序一致 。def a (x,y,z): print(x,y,z) a (1,2,3)123命名参数:可以不按照顺序赋值,赋值的时候,形参=实参。b(y=100,x=10,z=1)##(x,y,z = 10,100,1)12##查看函数帮助信息 help(函数名)print(help(b))12默认值参数:定义形参时,给形参默认值,默认值参数写在参数列表的最右侧。(使用默认值参数时,可以不用给拥有默认值的形参赋值)def a(x=1,y=2,z=3): print(x,y,z)12可变长度参数:在普通参数前面加 *。 形参会将接受到的所有参数放置在一个元组中。eg: 求最大值def a(*b): m = b[0] for i in b[1:]: if m < i: m = i return m print(a(1,2,23,36))12345678可变长度命名参数:在普通参数前面加 **。eg:使用字典类型接收所有参数 {“形参” :实参}def a(b): print(b)a(name=“curry”,password=“123456”)input()12345三:匿名/递归/生成器函数前沿概括:1.变量作用域:定义的变量可以使用的代码范围2.全局变量:可以被所有函数访问3.局部变量:只能在代码块内部使用(引用时速度比全局变量快,优先考虑)4.注意事项:当程序运行时,python先从局部作用域开始搜索变量,如果局部没有则从全局中找,找不到会抛出NameError,如果全局变量与局部变量重名,则内部访问则是局部变量,外部是全局变量匿名函数 :语法:lambda 参数1,参数2… : 返回值所谓匿名,意即不再使用 def 语句这样标准的形式定义一个函数。lambda 只是一个表达式,函数体比 def 简单很多。lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去。lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数eg:sum = lambda arg1, arg2: arg1 + arg2print ("相加后的值为 : ", sum( 10, 20 ))##结果为30123递归函数:程序调用自身的编程技巧称为递归( recursion)优缺点:①优点:定义简单,逻辑清楚②缺点:递归效率不高,因为每次调用都有数值存放,但是空间有限。在递归时候主义不可无线递归或者递归次数过大eg1:def tri_recursion(k): if(k>0): result = k+tri_recursion(k-1) print(result) else: result = 0 return resulttri_recursion(6)12345678eg2:def fun(n): if n == 1 or n ==0: return 1 else: return n * fun(-1)print(fun(5)) 123456生成器函数在 Python 中,使用了 yield 的函数被称为生成器(generator)一个包含yield关键字的函数就是一个生成器函数。并且yield不能和return共用。在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行生成器函数执行之后会得到一个生成器作为返回值,并不会执行函数体。执行了__next__()方法之后才会执行函数体,并且获得返回值。next()内置方法,内部调用生成器函数的__next__()方法。yield和return相同的是可以返回值,但是不同的是yield 不会结束函数当处理大量数据时,一个个获取数据,以节省空间。eg:def fun(): yield “a” yield “b” yield “c"12345只有使用next()函数执行生成器对象或循环生成器对象时,才会一个个返回数据。eg:g = fun()for i in g: print(i) t = ( i for i in range(10) if i % 2 == 0 )print(t)print(next(t))1234567使用 yield 实现斐波那契数列:斐波那契eg1:import sys def fibonacci(n): # 生成器函数 - 斐波那契 a, b, counter = 0, 1, 0 while True: if (counter > n): return yield a a, b = b, a + b counter += 1f = fibonacci(10) # f 是一个迭代器,由生成器返回生成while True: try: print (next(f), end=” ") except StopIteration: sys.exit() #输出的结果是:0 1 1 2 3 5 8 13 21 34 551234567891011121314151617斐波那契eg2:def fibonacci(n): a,b = 0,1 while a < n: yield a a,b = b,a+b for i in fibonacci(10000): print(i)input() #输出的结果是:0 1 1 2 3 5 8 13 21 34 55…1234567891011四:高阶函数概念:满足下列两个条件之一的函数就是高阶函数1:函数可以作为参数被传递2:函数可以作为返回值输出eg:def g_add(f,x,y): return f(x) + f(y)print(g_add(lambda a:a2,3,4)) # 25 print(g_add(len,“abcd”,“123”)) # 7 1234常用的高阶函数有五个:①map②reduce③filter④sorted⑤reersedmap函数map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。map(f,lis) f 需要至少一个形参eg:将lis中的每个值都作为f的实参执行后的结果生成一个新的序列对象。def func(x): return x ** 3 items = map(func,range(10))print(list(items)) #结果[0,1,8,27,64,125,…]123453.假如我们有一个函数f(x)=x2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现:在这里插入图片描述函数reducereduce把一个函数作用在一个序列[x1, x2, x3…]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算(累计函数)eg:from functools import reducedef add(x,y): return x * y res = reduce(add,range(1,5)) # [0,1,2,3,4]# 0 + 1 # 1 + 2 # 3 + 3 # 6 + 4# 10 print(res)1234567891011内置函数filterpython内建的filter()函数用于过滤序列和map()类似,filter()也接收一个函数和一个序列。和map()不同的时,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。filter(f,lis)eg:res1 = filter(lambda x: True if x > 5 else False ,[0,1,2,3,4,5,6,7,8,9]) print(list(res1))import random dic = {i:random.randint(1,100) for i in range(10)} keys = sorted(dic,key=lambda x:dic[x])for k in keys: print(k,dic[k])input()12345678内置sorted函数sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序,按照字符串长度排序eg:dic = { “A”: 20, “B”: 15, “C”: 40}lis2 = list(sorted(dic, key=lambda x: dic[x]))for key in lis2: print(key, dic[key])12345678函数嵌套与nonlocal关键字待补充…使用nonlocal关键字,将变量标记为不在本地作用域定义,而在上级的某一级局部作用域中定义,但不能是全局作用域中定义!函数柯里化待补充…柯里化(Currying)是把接受多个参数的函数变换成接受一个单一参数(最初函数的第一个参数)的函数,并且返回接受余下的参数且返回结果的新函数的技术eg:print(func2(5)(6))1闭包待补充…闭: 函数里面还嵌套了函数包:包含了对外部函数作用域中变量的引用内部函数包含对外部作用域而非全局作用域变量的引用,该内部函数成为闭包函数装饰器函数在不修改原函数代码的前提下,给原函数增加或修改功能,可以使用装饰器函数它将原函数作为参数,放到装饰器内部定义的函数中执行在内部函数中增加新的功能返回内部函数用于替换原函数def tools (func): def inster (*args,**kwargs): print(“开始执行。。。”) res = func(*args,**kwargs) print(“结束执行。。。”) return res return inter@tools #装饰器语法糖 func1 = tools(func1)def func1(): for i in range(10): print(i,end="") print()funcl()12345678910111213eg:使用装饰器函数 获取某个函数运行n次的平均时间import time1带参数的装饰器:def run1文章最后发布于: 2020-10-30a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值