python窗体生成器_python--生成器

生成器

一、概念

python中的生成器(generator)保存的是算法,只有当真正调用需要的值的时候才会去计算出值。它是一种惰性计算(lazy evaluation)。

二、列表生成式

定义一个列表

a = [0,1,2,3,4,5,6,7,8,9]

除了上面直接定义外,我们还可以使用列表生成式:

a = [i for i in range(10)]

print(a)

#输出

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

三、生成器

通过上面的列表生成式,我们可以直接创建一个列表。但是受到内存的限制,列表的容量是有限的。而且如果我们创建了一个包含数百万元素的列表,并且只需要用到前面几个元素,那就有大部分空间浪费了。

所以,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断的推算后续的元素?这样就不必创建完整的list,从而节省大量的空间。在pyhong中,一边循环一边计算的机制,称为生成器:generator。

要创建一个generator有很多种方法,我们可以直接将列表生成式改成生成器:

>>> a = (i for i in range(10))

>>> a

at 0x0000024897F6B4C0>

3.1 列表生成式和生成器

a = (i for i in range(100000000))

b = [i for i in range(100000000)]

a的生成时间是瞬时的,并且不会占用什么内存空间。因为生成器根本就没有生成所需的内容,只有在访问的时候才会生成相应的值

3.2 访问生成器

生成器只保留当前位置的值,直接访问 a[5]是没有值的(报错)

只有一个__next()__方法

只能一个一个取值,并且只能往后取值,不能返回取前面的值

使用循环来取值:

a = (i for i in range(10))

for i in a:

print(i)

#输出

0

1

2

3

4

5

6

7

8

9

使用__next()__方法取值:

a = (i for i in range(10))

print(a.__next__())

print(a.__next__())

print(a.__next__())

print("插入")

print(a.__next__())

print(a.__next__())

#输出

0

1

2

插入

3

4

每调用一个__next()__方法,我们就能取到一个值,并且我们只能往后取值。生成器能记住当前位置的值,但是并不知道前后位置的值,这也是生成器能够节省内存的原因。只有调用到该位置时才会生成相应的数据。

四、yield将函数转换成生成器

利用列表只能实现一部分的功能,一下复杂的运行就不能通过列表生成式这样的来实现了。但是我们可以将一个函数变成生成器。

斐波那契函数:

def fib(n):

a = 1

b = 1

number = 0

while number < n:

print(b)

a,b = b,a+b

number += 1

将该函数变成生成器只需要将print(b) 改为 yield b

def fib(n):

a = 0

b = 1

number = 0

while number < n:

#print(b)

yield b

a,b = b,a+b

number += 1

f = fib(10)

print(f.__next__())

print(f.__next__())

print(f.__next__())

print(f.__next__())

#输出

1

1

2

3

五、生成器结束

生成器不会把结果保存在一个系列中,而是保存生成器的状态,在每次进行迭代时返回一个值,直到遇到StopIteration异常结束。

def fib(n):

a = 0

b = 1

number = 0

while number < n:

#print(b)

yield b

a,b = b,a+b

number += 1

return '--done--'

f = fib(6)

while True:

try:

x = next(f)

print(x)

except StopIteration as e:

print('Generator return value:',e.value)

break

#输出

1

1

2

3

5

8

Generator return value: --done--

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当然可以!以下是一个简单的示例,演示如何在C#窗体应用程序中预留COM接口供Python调用: 首先,创建一个C#窗体应用程序项目。在项目中添加一个窗体(Form)并在窗体上放置一个按钮(Button)。 在窗体代码中添加以下内容: ```csharp using System; using System.Windows.Forms; using System.Runtime.InteropServices; namespace COMInteropExample { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { MessageBox.Show("Hello from C#!"); } [ComVisible(true)] public string SayHello() { return "Hello from C#!"; } } } ``` 在窗体设计器中双击按钮,将其点击事件绑定到`button1_Click`方法。 接下来,右击项目,选择“属性”,在属性窗口中找到“应用程序”选项卡。在“输出类型”下拉菜单中选择“Windows应用程序”。然后,在“常规”选项卡中找到“启动对象”并选择“Sub Main”。 在项目中添加一个新的类文件,命名为`Program.cs`,并将其内容更改为以下代码: ```csharp using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; namespace COMInteropExample { static class Program { [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new MainForm()); } } } ``` 现在,我们需要将该项目生成为COM可访问库。右击项目,选择“生成”->“生成COM可访问库”。 完成上述步骤后,生成的DLL文件将在输出文件夹中生成。 接下来,我们可以使用Python来调用这个COM接口。以下是一个示例Python代码: ```python import win32com.client # 创建COM对象 com_obj = win32com.client.Dispatch("COMInteropExample.MainForm") # 调用COM接口方法 result = com_obj.SayHello() print(result) ``` 确保你已经安装了`pywin32`库,然后运行上述Python代码,你将看到从C#窗体应用程序中返回的消息。 这是一个简单的示例,演示了如何在C#窗体应用程序中预留COM接口供Python调用。你可以根据自己的需求进行扩展和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值