函数及生成器

Python学习之 ---生成器+生成器函数 生成器★★★★ 知识导图 生成器generator ● 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 ● 生成器对象,是一个可迭代对象,是一个迭代器 ● 生成器对象,是延迟计算、惰性求值的 生成器函数 ●函数体中包含yield语句的函数,就是生成器函数,调用后返回生成器对象. 生成器函数 def inc(): ... 阅读详情

*********函数*********

1).函数的定义和使用

定义函数, 并不会执行;

***无参数的函数***

#定义函数
def hello():
    # 函数体
    print("hello")

# 调用函数
hello()


***带参数的函数***

(定义函数函数名后的参数是形式参数,调用函数时添加的是实际参数)

def fun1(name):
    # name = "fentiao"
    # 定义函数时的变量称为形式参数, 变量名可以任意起;

    print("hello %s" %(name))

fun1("fentiao")


2).函数额的返回值


# 函数调用时一般有返回值;没有返回值时, python中默认返回None;
def hello():
    print("hello")


res = hello()
print(res)

def fun(a):   # a = [1, 2, 3, 4, 5]
    # 接收一个列表, 求这个列表的最大值,平均值, 最小值;
    max_num  = max(a)
    min_num = min(a)
    avg_num = sum(a)/len(a)

    # python函数中, 只能返回一个值;
    # 如果要返回多个值, 会把返回的值封装为一个元组数据类型;
    return max_num, avg_num, min_num


variables  = fun([1, 2, 3, 4, 5])
print(variables, type(variables))


3.)函数中形参的类型


***必选参数***


def add(x, y, z):  # x=1, y=2
    return x + y + z
print(add(2,3,4))

***默认参数***


def mypow(x, y=2):
    return x ** y
print(mypow(2))
print(mypow(2, 3))



***可变参数***


# *args, args实质是一个元组;
def mySum(*args):
    print(args, type(args))
    return  sum(args)


print(mySum(1,2,3,4,5))



***关键字参数***


# 关键字参数**kwargs<生成字典>


def func(label,value,**kwargs):
    str1=''
    for key, valu in kwargs.items():
        str1+='%s+%s'%(key,valu)
    return '<%s %s>%s</%s>'%(label,str1,value,label)
print(func('dict','网页',id='s.sdj',height=100,width=100))

注:定义函数时, 默认参数的默认值尽量不是可变参数

参数顺序:必选,>  默认,>  可变,>  关键字

4).函数的作用域

num = 10
print("out fun: id=", id(num))

def fun():
    # 局部作用域, 在函数运行时生效, 函数运行结束则释放;
    num = 2#当函数执行结束, 变量num的值2被释放掉
    print("in fun: id=", id(num))
    print("in fun: num = %s" %(num))

fun()
print("out fun: num =%s" %(num))


***global关键字***


num = 10


def fun():
    # 通过global关键字声明局部变量为全局变量, 让函数执行完, 2依旧生效;
    global num
    num = 2

fun()
print(num)


5).函数的练习

题目需求:
    对于一个十进制的正整数, 定义f(n)为其各位数字的平方和,如:
    f(13) = 1**2 + 3**2 = 10
    f(207) = 2**2 + 0**2 + 7**2 = 53

    下面给出三个正整数k,a, b,你需要计算有多少个正整数n满足a<=n<=b,
    且k*f(n)=n

输入:
    第一行包含3个正整数k,a, b, k>=1,  a,b<=10**18, a<=b;
输出:
    输出对应的答案;

范例:
    输入: 51 5000 10000

    输出: 3


def fn(n):
    a = 0
    for i in str(n):
        a += int(i) ** 2
    return a


def isok(k, n):
    if k * fn(n) == n:
        return 0
    else:
        return 1


def main(k, a, b):
    count = 0
    for n in range(a, b + 1):
        if isok(k, n) == 0:
            count += 1
    return count


print(main(51, 5000, 10000))


注:

是否可以进行迭代的判断:

from collections import Iterable#导入模块(Iterable可迭代的)

isinstance(1, int)
print(isinstance(1,Iterable))
print(isinstance({1,2,3},Iterable))

*********生成式*********

***列表生成式***

li = ['frdgrfgdsHHJJ', 'cdsfregHHHJDGF']

print([i.lower() for i in li])


***字典生成式***

#大小写key值合并, 统一以小写key值输出;
d = dict(a=2, b=1, c=2, B=9, A=5)

print({k.lower():d.get(k.lower(),0)+d.get(k.upper(),0) for k in d})


***集合生成式***

print({i ** 2 for i in {1, 2, 3, 9, 12} if i % 3 == 0})


*********生成器*********

#列表生成式

# li = [i for i in range(100) if i%2==0]
# #  生成器

# g = (i for i in range(100) if i%2==0)

***生成器的查看***

python3中 g.__next__方法(), python2.x中g.next()    通用的方式:next(g)

for 循环查看



def gen():
    while True:
        try:
            yield 'a'
        except TypeError:
            print('type error')


#  throw方法:给生成器发送一个异常(错误); 但是不影响g.__next__()的执行;
#  close(): 关闭生成器, 再次执行g.__next__()报错;
g = gen()
print(g.__next__())
g.throw(TypeError)
print(g.__next__())

当在函数中看到yield关键字, 那么这个函数调用的返回值是一个生成器

def fib(num):
    a, b, count = 0, 1, 1  # 0, 1
    while count <= num:
        yield b
        a, b = b, a + b  #a=2, b=3
        count += 1

g = fib(10)
for i in g:
    print(i)


yield的用法及<生产者消费者模型>


import time
import random
def comsumer(name):
    print('%s准备买包子'%name)
    while 1:
        kind=yield
        print('%s已经购买了%s味的包子'%(name,kind))
def producer(name):
    a=comsumer('张龙')
    b=comsumer('少鹏')
    a.__next__()
    b.__next__()
    print('厨师%s正在制作包子'%name)
    for kind in ['微辣','中辣','特辣']:
        time.sleep(random.randint(1,2))
        print('厨师%s已经制做好了%s味的包子'%(name,kind))
        a.send(kind)
        b.send(kind)
producer('王浪')




*********高阶函数*********

***map函数***

#map(fun,Iterable)对可迭代对象依次执行fun函数

# 需求: 用户接收一串数字; '1 3 5 7 8', 将该字符串中的所有数字转化为整形,并以列表格式输出;
s = '1 3 5 7 8'
print(list(map(int, s.split())))

***reduce函数***

reduce在python2中可以使用,在python3.x不是内置高阶函数, 而是需要导入from functools import reduce;

# 需求: 用户输入数字n; 求n的阶乘;  5!= 1*2*3*4*5
from functools import reduce


def func(x,y):
    return x*y
print(reduce(func, range(1,6)))   # func(func(1,2),3)



***filter函数***

#filter(func, iterable),只有一个形参, 函数的返回值只能是True或者False

def isodd(num):
    if num %2 == 0:
        return True
    else:
        return False
print(list(filter(isodd, range(10))))


***sorted函数***

# 排序: 由大到小
print(sorted([23,56546,78]))

# 排序: 由小到大, reverse=True, 代表排序后进行反转;
print(sorted([23,56546,78], reverse=True))




info = [
    ['001', 'apple', 1000, 2],
    ['002', 'xiaomi', 10, 2000],
    ['003', 'Oppo', 200, 1900],
    ['004', 'computer', 900, 5000]
]

def sorted_by_count(item):
    return item[2]

print(sorted(info, key=sorted_by_count))

另外:匿名函数(简化普通函数/匿名函数的关键字为  lambda, 冒号前面是形式参数, 冒号后面是返回值)

eg:

f = lambda : "hello"
print(f())


f1 = lambda x, y=2: x**y
print(f1(2))
print(f1(2,3))


f2 = lambda  *args: sum(args)
print(f2(1,2,3,4,5))



*********装饰器*********


装饰器应用场景: 如果你想在执行函数之前做什么或者执行函数之后做什么, 建议使用装饰器;

模板:

import functools


def add_info(fun):
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        # 函数执行之前做的操作
        res =  fun(*args, **kwargs)
        # 函数执行之前做的操作
        return res
    return wrapper

练习1:


def admin(fun):
    def wrapper(*args,**kwargs):
        if kwargs.get('name')=='root':
            fun(*args,**kwargs)
        else:
            print('不是管理员,没有权限添加学生信息!')
    return wrapper

@admin
def add_student(name='root'):
    print('***添加学生信息***')
add_student(name='student')


练习2:


# def addii(i):
#     def pp():
#         print('新年快乐!\n欢迎来到ICBC!')
#         i()
#     return pp
#
# @addii
# def savemoney():
#     print('存钱......')
# savemoney()



Python函数学习-生成器函数 Python3函数学习     本篇是对 Python3函数中生成器函数的学习与小结,用于复习巩固使用,如有理解偏差的地方,还望各位大佬指正。 生成器 生成器定义 生成器:generator 生成器一般指的是生成器对象generator,是一种特殊的迭代器。 可以由生成器表达式得到。 可以使用yield关键字得到一个生成器函数,再通过调用这个函数得到一个生成器对象 ... 阅读详情

相关推荐

大厂嵌入式面试常考八股文及算法

1.指向已被释放或无效的内存地址的指针是野指针。互斥锁是一种用于线程同步的机制,用于确保同一时间只有一个线程访问共享资源。多态是面向对象编程中的一种特性,它允许以一种统一的方式处理不同类型的对象,通过相同的接口可以表现出不同的行为。大小端(Endian)指的是在计算机存储和处理多字节数据时,字节的存储顺序。大端序(Big Endian):高位字节存储在低地址,低位字节存储在高地址。类似于将数字的高位放在左边,低位放在右边的表示方式。例如整数值0x12345678在内存中按照大端序排列为。

谢谢大家的关注 6159

生成器函数(generator)

本文详细介绍了生成器函数的相关知识点,包括生成器函数的定义、生成器函数和迭代器的关系、生成器函数的用法、背压模式等内容。本文将详细介绍生成器函数的相关知识点,包括生成器函数的定义、生成器函数和迭代器的关系、生成器函数的用法、背压模式等内容。生成器函数和普通函数的区别在于它可以使用特殊的语法来控制生成器对象的输出,从而实现按需生成值序列,避免一次性生成大量的值,减少了内存占用。生成器函数和迭代器之间具有紧密联系,生成器函数可以创建一个迭代器对象,该对象可以实现可迭代对象的遍历。我们可以使用生成器函数和。

rkcy的博客 7980

Win11桌面图标小箭头去除与恢复:解决任务栏关联错误的完整指南

本文提供了一份完整的Win11桌面图标小箭头去除与恢复指南,重点解决了因错误方法导致的任务栏关联错误问题。通过分析注册表中IsShortcut键值与Shell Icons的原理,推荐安全的“替换图标资源法”,并提供了可一键执行的批处理脚本,确保在美化桌面的同时不影响系统功能与默认应用设置。

weixin_29288313的博客 944

在线的函数曲线生成工具

这些在线数学图像软件不需要安装,‌只需要一个浏览器就可以使用,‌非常方便快捷,‌同时也能提供高质量的图像结果1。

君君的博客 4万+

C#---第十一课:对列表的各种操作,添加、删除、排序、列表长度、获取元素的索引、FirstOrDefault()、SingleOrDefault()、last()

1.添加元素 2.删除元素 (1)删除列表中指定的元素 (2)删除列表A中所有与列表B相交的元素---常规 (3)删除列表A中所有与列表B相交的元素---lambda 3.排序(正序、倒序) 4.获取列表的最大容量(长度)、已用容量 6.获取元素在列表中的位置(index) 7.判断某元素是否在列表List中 8.获取列表中第一个元素First() & FirstOrDefault() 9.获取列表中唯一元素Single() & SingleOrDefault() 10.获取列表中最后一个元素

Alien-Hu 3627

Win11下USB-Blaster驱动安装全攻略:Quartus用户必看(附常见问题解决)

本文详细介绍了在Windows 11系统下为Intel FPGA开发工具Quartus安装USB-Blaster驱动的完整流程与常见问题解决方案。针对Win11更严格的驱动签名验证机制,提供了从标准安装步骤到高级故障排查(如禁用驱动强制签名、使用测试模式)的实用指南,帮助用户快速解决驱动安装失败问题,确保FPGA编程调试顺利进行。

weixin_29256771的博客 663

生成器函数(generator)

generator yield

qq_35856778的博客 5175

VScode中配置 C/C++ 环境,超级详细,问题分析全面,绝对好用

VScode中配置 C/C++ 环境,超级详细,问题分析全面,绝对好用 VScode中配置 C/C++ 环境 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 1. 下载编辑器VScode 1.官网:https://code.visualstudio.com/ 2. 安装VScode(建议附加任务全部勾选; 2. 下载编译器MinGW并解压 官网页面:https://www.mi

m0_46147064的博客 8万+

函数生成器、生成器表达式,列表推导式

一、生成器 ⼀.⽣成器什么是⽣成器.⽣成器实质就是迭代器. def fun(): print('111') return '222' g = fun() print(g) 将函数中的return换成yield就是⽣成器 def fun(): print('111') yield '222' g = fun() print(g) # <generator object fun at 0x014BB990> def func()...

m0_60861079的博客 3387

开发者的避坑指南:在Apple Silicon Mac上构建RocketMQ Python客户端的完整心路历程

本文详细记录了在Apple Silicon Mac上构建RocketMQ Python客户端的完整过程,重点解决了架构兼容性问题。通过源码编译rocketmq-client-cpp库,修复构建脚本和CMake配置,最终成功在M2芯片MacBook Pro上部署RocketMQ Python客户端,为开发者提供了实用的避坑指南。

Pepper的专栏 696

linux系统下XDMA驱动的安装与测试问题总结

先看两个常见的问题。一个是驱动安装问题,一个是驱动测试错误;error 512 能识别PCIE的设备,但是The kernel modle installed correctly, but no devices were recognized.

whm128的博客 3805

python 函数—生成器

python生成器的详细解释,生成器适合用于处理大型数据

weixin_65289420的博客 4949

手把手教你学PCIE(10.5)--PCIE故障排除方法的分步排查法介绍

通过以上分步排查法,你可以系统地诊断和解决 PCIe 设备的故障。每个步骤都有助于逐步缩小问题范围,最终找到并解决问题。

MHD0815的博客 1873

函数生成器

生成器 生成器 generator 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 生成器对象,是一个可迭代对象,是一个迭代器 生成器对象,是延迟计算、惰性求值的 生成器函数 函数体中包含 yield 语句的函数,就是生成器函数,调用后返回生成器对象 普通函数调用,函数会立即执行直到执行完毕,生成器函...

weixin_44737199的博客 7011

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

JavaScript:生成器函数

在介绍生成器函数之前先了解一下ES6的一个关键字,名为yieldyield关键字,可以让代码在其出现的地方暂停执行,它只能在生成器函数内部使用。

前端御书房 2308

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Python生成器函数

一丶生成器generator 生成器指的是生成器对象,可以有生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 生成器对象,是一个可迭代对象,是一个迭代器 生成器对象,是延迟计算、惰性求值的 二丶生成器函数 函数体中包含yield语句的函数,就是生成器函数,调用后返回生成器对象 In [1]: x = (i for i in range(5))...

ammmao的博客 866

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

c语言函数生成器,生成器以及内置函数

生成器的初始生成器构建方式通过生成器函数(自己写的函数)通过生成器推导式通过python内置的函数或者模块提供(python提供的生成器函数)def func():print(111)return 2ret = func()print(ret)执行此函数,遇到return结束函数。将数字2返回给ret。def func():print(111)print(111)print(111)print(1...

weixin_39559333的博客 738

python——函数之生成器

1 生成器函数的含义   生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法。相较迭代器而言,生成器简单使用。 2 生成器的创建方式   2.1 生成器表达式     把列表推导式的[] 修改为(),如 (i for i in range(1, 10000) if i % 2 == 0)   代码执行界面如下...

dianchen5200的博客 383

生成器函数

生成器 生成器generator 生成器指的是生成器对象,可以由生成器表达式得到,也可以使用yield关键字得到一个生成器函数,调用这个函数得到一个生成器对象 生成器对象,是一个可迭代对象,是一个迭代器 生成器对象,是延迟计算,惰性求值的 生成器函数 函数体包含yield语句的函数,就是生成器函数,调用后返回生成器对象 m = (i for i in range(5)) #生成器表达式 ...

刘振的博客 697

生成器函数 generater

生成器函数 generater 生成器函数generater 遇到yield 停止执行 通过next ->(iter.next()) 去调用的是 移动到下一个yield停止 返回的值 为yield {value:yield的结果,done:false} function * love(){ yield "我"; yield "好"; yield "中"; yield "意"; yield "你"; yield "啊"; } var iter = love(); for(let i

当历史只剩罪恶,唯有推倒重来,我们开创文明,我们传承文明,周而复始,生生不息。 1731

Python的生成器函数

1. 生成器的概念 生成器是Python中的一个对象,对这个对象进行操作,可以依次生产出按生成器内部运算产生的数据。但是要注意,如果不对生成器进行操作,是不会产生数据的。称这样的方式为惰性求值,延或者迟求值。 2. 构造生成器 2.1生成器表达式 以前学过一种方式叫生成器表达式,例如: g1 = (x*2 for x in range(5)) next(g1) 0 next(g1) ...

LittleHuang950620的博客 5285

Python之函数进阶-生成器函数

生成器对象生成器表达式, 每一次生成器表达式执行一次都会得到一个全新的生成器对象生成器函数,每一次函数调用都会得到全新的生成器对象。只要有yield语句的函数都是生成器函数生成器函数每一次执行到yield这一句,把yield的值返回return非常强势,见到它函数就完了。如果你用next驱动生成器对象,碰到了return,用for不会抛出异常碰到return就退出了惰性本身是推荐的,还有它用在了协程中,线程、进程之后# 示例def inc():count = 0。

weixin_41224474的博客 766

ES6 生成器函数

ES6 生成器函数

哈哈绝的博客 543

python生成器函数_Python 编写生成器函数

Python 编写生成器函数,可以将许多函数简洁地写成生成器表达式的形式,比如之前讲过的映射和过滤。另外,也可以用Python内置的高阶函数(例如map()或者filter())或者生成器函数实现这些函数。编写代码时,如果生成器函数中包含多条语句,要留意代码实现是否偏离了函数式编程的指导原则:对无状态的函数求值。使用Python进行函数式编程,就像在刀锋上行走:一边是纯函数式编程,一边是命令式编程...

weixin_39889544的博客 420

JavaScript生成器函数(generator function)

JavaScript生成器函数(generator function) 注意:数组推导式和生成器推导式建议都不要使用。都是非标准语法。 可以使用生成器函数(generator function) 语法: function* 函数名(参数){函数体} 生成器函数在执行时能暂停,后面又能从暂停出继续执行。 使用yield关键字可以暂停函数 调用一个生成器函数,会得到生成器的迭代器对象。...

兰枫 8570
上一篇: 装饰器和函数练习
下一篇: 文件操作练习
wl_python
博客等级 码龄9年 21粉丝 28原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值