Pb中Yield()函数的使用
PB中很实用的小技巧

1.RGB函数计算公式: 颜色值= (65536 * Blue) + (256 * Green) + (Red)2.控件可拖动:send(handle(this),274,61458,0)3.如何用程序控制下拉子数据窗口的下拉和收起用modify或者直接用dw_1.object.col1.dddw.showlist = true4.检索参数有些不需要传入则传%.5.如何屏蔽鼠标滚轮触发在控件的other事件写if message.number = 522 then return 16.得到数据窗口的语法:string ls_dwsyntaxls_dwsyntax=dw_1.describe("datawindow.syntax")7.得到数据窗口中各列及标题:long ll_count,istring ls_value,ls_colnamell_colnum = Long(dw_1.object.datawindow.column.count)for i = 1 to ll_colnum//得到标题头的名字ls_colname = dw_1.describe('#' + string(i) + ".name") + "_t"ls_value = dw_1.describe(ls_colname + ".text")next8.在程序中动态设置初始值:ex:dw_contro.object.columnName.initial = 'xxxx'9.如何在DataWindow的SQL语法中不使用SELECT DISTINCT实现删除重复的行---- 起先对你要显示唯一值的列进行排序:"city A",然后增加如下过滤字符串:" city < > city [-1] or GetRow () = 1"10.如何改变列的字体颜色,提醒用户此列已做修改---- 在列的Color属性中,输入如下表达式IF (column_name< >column_name.Original, RGB(255, 0, 0), RGB(0, 0, 0))。
python中yield的用法-简单明了!

python中yield的⽤法-简单明了!
我也仿照博⽂写了下例⼦:
def demo():
print("开始执⾏...")
while 1:
res = yield '这是返回值'
print("res:",res)
d1 = demo()
print(d1)
print(next(d1))
print("*"*20)
print(next(d1))
执⾏结果如下:
开始执⾏...
这是返回值
********************
res: None
这是返回值
代码解释,个⼈理解,说得不对希望能够点出:
d1 = demo();⽣成⼀个对象,不会输出任何内容
print(d1); 这⾥不输⼊任何内容,因为程序第⼀次遇到yield就暂停了,即使yield前⾯有输出语句,⼀样给输出
print(next(d1)); 程序会接着yield继续执⾏,第⼆次遇到yield,return“这是返回值”,加起来就会会输出开始执⾏...
这是返回值
print(next(d1));再次执⾏next(d1),相当于第三遇到yield,因为上⼀步相当于被return,res并没有赋值,所以为None,继续执⾏while,第四次遇到yield,输出“这是返回值”。
python yield语法

一、概述Python是一种高效的编程语言,拥有丰富的语法结构和功能特性。
其中,yield语法作为Python中的一项重要特性,被广泛用于实现迭代器和生成器。
本文将对yield语法进行详细的介绍和讨论,以便读者更好地理解和应用这一语法特性。
二、yield语法的基本概念1. yield语法的作用yield语法在Python中主要用于定义生成器函数,它可以让生成器函数在产生值的同时保持其内部状态,实现了惰性求值的特性。
通过yield语法,我们可以以一种高效的方式生成大量数据,而不需要一次性将所有数据存储在内存中。
2. yield关键字的使用在Python中,使用yield关键字可以将一个普通函数转换成生成器函数。
当生成器函数被调用时,它会返回一个生成器对象,通过该对象可以逐步获取函数中yield语句产生的值。
在每次调用生成器的next()方法时,生成器函数都会从yield语句的位置继续执行,直至再次遇到yield语句或者函数执行完毕。
三、yield语法的具体应用场景1. 实现惰性求值yield语法的主要优势在于可以实现惰性求值。
当需要处理大量数据时,我们可以使用yield语法逐步生成并处理数据,而不必一次性将所有数据加载到内存中。
这在处理大型数据集或者无限序列时尤其有用。
2. 优化内存占用由于yield函数的特性,它可以大大优化程序的内存占用。
在生成数据的过程中,我们不需要一次性存储所有数据,而是可以在需要时逐步生成数据并处理,从而节约内存空间。
3. 实现无限序列利用yield语法,我们可以轻松地实现无限序列。
生成器函数可以不断产生新的值,而不受内存限制,这为处理一些需要无限次获取值的场景提供了方便。
四、yield语法与其他语法特性的对比1. yield与return的区别在生成器函数中,yield语句用于产生值并保持函数的状态,而return语句则用于返回最终的结果并终止函数的执行。
两者在功能和语法结构上有较大的差异。
python3.8 yield的用法

Python3.8是Python编程语言的一个重要版本,引入了一系列新的特性和改进。
其中,yield关键字的用法得到了一次重要的更新和改进。
yield关键字一直是Python中一个非常强大和灵活的特性,它可以用于生成器函数中,实现惰性求值和迭代计算等功能。
在Python3.8中,yield得到了一次重要的改进,使得它在协程和异步编程中的应用得到了大大的增强。
本文将详细介绍Python3.8中yield的用法,并分析其在实际项目中的应用。
一、yield的基本用法在Python中,yield关键字主要用于定义生成器函数。
生成器函数是一类特殊的函数,它可以产生一系列的值,并且在产生值的过程中可以暂停和恢复。
这种暂停和恢复的机制称为“协程”(coroutine)。
在Python3.8之前的版本中,yield主要用于实现简单的生成器函数,如下所示:```pythondef my_generator():yield 1yield 2yield 3```上面的代码定义了一个简单的生成器函数,该函数可以产生1、2、3三个值。
在调用该函数时,可以使用for循环来迭代这些值:```pythonfor value in gen:print(value)```这段代码会依次输出1、2、3这三个值。
可以看到,yield关键字可以让一个函数变成一个迭代器,我们可以通过next()函数或者for循环来逐个获取生成器函数产生的值。
在Python3.8中,yield的用法得到了进一步的改进,使得它可以更加灵活和强大。
二、yield from的用法在Python3.3中,增加了yield from关键字,用于简化生成器函数的编写,使得可以更加方便地将一个生成器函数中的值传递给另一个生成器函数。
在Python3.8中,yield from得到了一次重要的改进,使得它可以更加灵活和强大。
下面是一个简单的例子:```pythondef sub_generator():yield 'a'yield 'b'yield 'c'def my_generator():yield from sub_generator()for value in gen:print(value)```上面的代码中,sub_generator是一个简单的生成器函数,产生了三个值。
pythonyield理解与用法

pythonyield理解与用法
Python的强大特性之一就是它提供了一种叫做yield的机制,它比常规的顺序调用函数更加灵活。
本文将介绍yield的概念、原理以及应用。
概念
Yield是Python中类似C#和Java中的“yield return”或者“yield break”语法,它可以替换调用者控制函数的行为。
与C#和Java类似,它可以让你编写类似迭代的代码,但更加简洁。
原理
Yield的本质是一个生成器,它可以创建一个迭代器对象,在每次请求时生成一个值,以便在更多的请求时有其他的值可以使用。
此外,它会在每次调用时保留函数的状态,因此可以实现更复杂的控制结构。
应用
Yield的最大好处在于可以用来构建可迭代对象,而无须使用类。
它是一种更轻量级的迭代实现方式。
另一方面,它也可以实现延迟计算,减少创建和销毁实例的性能开销。
另外,yield也可以用来改善短时间内处理大量数据的性能,因为它可以把数据流分割成少部分,每次只处理一部分数据。
总结
本文介绍了Python中yield的概念、原理以及应用,特别是构建可迭代对象以及获取延迟计算的好处,同时它还可以用来改善短时
间内处理大量数据的性能。
总体来说,这是一种有用的特性,可以减少开发时间,改善性能,更加灵活的控制结构,帮助Python应用开发者更好的利用Python的特性。
yield的用法详解

yield的用法详解一、什么是yield?yield是Python中的一个关键字,用于生成器函数(generator function)中。
生成器函数是一种特殊的函数,它可以在调用时暂停执行,并且在下次调用时从上次暂停的位置继续执行。
二、yield的基本语法在生成器函数中,我们可以使用yield语句将一个值返回给调用者。
以下是yield语句的基本语法:```pythonyield expression```其中,expression表示要返回的值。
三、yield语句工作原理当生成器函数被调用时,它并不会立即执行内部代码,而是返回一个迭代器(iterator)。
每次调用迭代器的__next__()方法或使用for循环进行迭代时,生成器函数才会开始执行内部代码,并在遇到yield语句时暂停执行,并将 yield 后面的表达式作为返回值。
四、生成器函数中多个yield语句的执行顺序在生成器函数内部可以有多个 yielf 语句。
当生成器被调用时,会按照顺序依次执行每个 yield 语句,并在每次遇到 yield 时暂停并返回一个值。
下次调用迭代器的__next__()方法或使用 for 循环进行迭代时,则会从上一次暂停处继续执行。
五、通过for循环迭代生成器生成器函数通常与 for 循环一起使用,方便迭代生成器的返回值。
当使用 for 循环迭代生成器时,会自动调用迭代器的__next__()方法,并将返回值赋值给循环变量。
六、利用yield实现惰性求值惰性求值是一种节省资源的编程技巧,它允许在需要时逐步计算结果。
生成器函数中的 yield 语句可以实现这一特性。
当生成器函数内部存在复杂且耗时的计算过程时,可以使用 yield 在每次迭代时进行部分计算并返回中间结果,从而避免处理大量数据导致的内存占用和时间开销。
七、应用场景举例-斐波那契数列斐波那契数列是一个经典的应用场景,可以通过生成器函数和 yield 语句非常简洁地实现。
powerbuilder常用函数
pb常用函数(一)(转)Abs()功能计算绝对值。
语法Abs ( n )参数n:要得到绝对值的数值型变量或表达式返回值返回值的数据类型与n的数据类型相同,函数执行成功时返回n的绝对值。
如果参数n的值为NULL,Abs()函数返回NULL。
Ceiling()功能返回大于n的最小整数。
语法Ceiling ( n )参数n:数值型变量或表达式返回值返回值的数据类型与n的数据类型相同。
函数执行成功时返回大于n的最小整数。
如果参数n的值为NULL,Ceiling()函数返回NULL。
Cos()功能计算余弦,其中参数以弧度为单位。
语法Cos ( n )参数n:数值型变量或表达式返回值Double。
函数执行成功时返回n的余弦。
如果参数n的值为NULL,Cos()函数返回NULL。
Exp()功能计算e的n次方。
语法Exp ( n )参数n:指定幂值返回值Double。
函数执行成功时返回e(约等于2.71828)的n次方。
如果参数n的值为NULL,Exp()函数返回N ULL。
Fact()功能计算n的阶乘。
语法Fact ( n )参数n:数值型变量或表达式返回值Double。
函数执行成功时返回n的阶乘。
如果参数n的值为NULL,Fact()函数返回NULL。
Int()功能得到小于等于n的最大整数。
语法Int ( n )参数n:数值型变量或表达式返回值Integer。
函数执行成功时返回小于等于n的最大整数。
如果n的值太小或太大,超过了整数的表示范围,则函数返回0。
如果参数n的值为NULL,Int()函数返回N ULL。
Log()功能计算n的自然对数。
语法Log ( n )参数n:数值型变量或表达式,其值必须大于0返回值Double。
函数执行成功时返回n的自然对数。
如果n小于等于0,将导致运行错误。
如果参数n的值为NULL,Log()函数返回NULL。
LogTen()功能计算n的常用对数(以10为底)。
参数n:数值型变量或表达式,其值必须大于0返回值Double。
yield 函数
yield 函数yield函数是Python语言中一个非常有用的功能。
它可以让一个函数在执行过程中暂停并返回一个中间值(称之为迭代器),然后在调用它时从之前中断的地方恢复执行。
在本文中,将介绍yield函数的用法及其实际应用。
第一步,理解yield函数的定义和语法结构。
在Python中,yield函数是一个生成器(Generator)函数。
它可以被调用以生成一个迭代器对象(Iterator),而该对象可以用于在函数的执行过程中暂停和恢复。
yield语句本身可以返回一个值,这个值可以作为下一次调用时yield关键字的返回值,也可以在外部接收。
第二步,了解如何使用yield函数。
使用yield函数需要定义一个生成器函数(Generator Function),该函数使用yield语句生成器函数。
在函数的执行过程中,当遇到yield语句时,函数会暂停执行并返回当前yield语句的数值。
下一次调用生成器函数时,函数会从上一个yield语句的下一行继续执行。
这里有一个简单的例子,通过yield实现斐波那契数列:``` Pythondef fibonacci(n):a, b = 0, 1for i in range(n):yield aa, b = b, a + b```在上面的代码中,斐波那契数列的前n个数值会被yield语句生成并回传出来。
每次调用fibonacci函数时,它都会返回一个Generator对象,该对象可以使用for循环或next函数遍历。
第三步,使用yield函数优化内存占用。
yield函数的一个非常重要的应用是减小内存占用,尤其是当处理大数据集时。
类似于Python内置的range函数,yield语句可以根据需要生成数值,而不是一次性生成所有的数值。
这样就可以有效地避免出现内存问题。
以下是一个例子,我们使用yield函数读取一个大文件:``` Pythondef read_file(file_path):with open(file_path, 'r') as f:while True:line = f.readline()if not line:breakyield line```在上面的代码中,每次只读取一个文件行,并使用yield语句将其生成。
python中yield函数的用法详解
python中yield函数的⽤法详解⾸先,如果你还没有对yield有个初步分认识,那么你先把yield看做“return”,这个是直观的,它⾸先是个return,普通的return 是什么意思,就是在程序中返回某个值,返回之后程序就不再往下运⾏了。
看做return之后再把它看做⼀个是⽣成器(generator)的⼀部分(带yield的函数才是真正的迭代器),好了,如果你对这些不明⽩的话,那先把yield看做return,然后直接看下⾯的程序,你就会明⽩yield的全部意思了:def foo():print("starting...")while True:res = yield 4print("res:",res)g = foo()print(next(g))print("*"*20)print(next(g))就这么简单的⼏⾏代码就让你明⽩什么是yield,代码的输出这个:starting...4********************res: None4我直接解释代码运⾏顺序,相当于代码单步调试:1.程序开始执⾏以后,因为foo函数中有yield关键字,所以foo函数并不会真的执⾏,⽽是先得到⼀个⽣成器g(相当于⼀个对象)2.直到调⽤next⽅法,foo函数正式开始执⾏,先执⾏foo函数中的print⽅法,然后进⼊while循环3.程序遇到yield关键字,然后把yield想想成return,return了⼀个4之后,程序停⽌,并没有执⾏赋值给res操作,此时next(g)语句执⾏完成,所以输出的前两⾏(第⼀个是while上⾯的print的结果,第⼆个是return出的结果)是执⾏print(next(g))的结果,4.程序执⾏print("*"*20),输出20个*5.⼜开始执⾏下⾯的print(next(g)),这个时候和上⾯那个差不多,不过不同的是,这个时候是从刚才那个next程序停⽌的地⽅开始执⾏的,也就是要执⾏res的赋值操作,这时候要注意,这个时候赋值操作的右边是没有值的(因为刚才那个是return出去了,并没有给赋值操作的左边传参数),所以这个时候res赋值是None,所以接着下⾯的输出就是res:None,6.程序会继续在while⾥执⾏,⼜⼀次碰到yield,这个时候同样return 出4,然后程序停⽌,print函数输出的4就是这次return出的4.到这⾥你可能就明⽩yield和return的关系和区别了,带yield的函数是⼀个⽣成器,⽽不是⼀个函数了,这个⽣成器有⼀个函数就是next函数,next就相当于“下⼀步”⽣成哪个数,这⼀次的next开始的地⽅是接着上⼀次的next停⽌的地⽅执⾏的,所以调⽤next的时候,⽣成器并不会从foo函数的开始执⾏,只是接着上⼀步停⽌的地⽅开始,然后遇到yield后,return出要⽣成的数,此步就结束。
pb datawindow38个技巧
字号:大中小PB DataWindow 38个技巧1 使DataWindow列只能追加不能修改如何使DataWindow中的数据只能追加新记录而不能修改,利用 Column 的 Protect 属性可以很方便的做到这一点,方法如下:将每一列的 Protect 属性设置为:If( IsRowNew(), 0, 1) )在 PowerScript 中可以动态修改 Protect 属性:dw_1.Modify("column_name_here.Protect='1~tIf(IsRowNew(),0,1)'")这样,DataWindow 中只有新追加的记录可修改,而其他记录是只读的。
2 如何在DataWindow中实现列的自动折行我们在PowerBuilder应用程序的开发过程中, 使用DataWindow时, 经常会遇到某列的数据太长, 不能同时全部显示的情况. 若采用自动水平滚动, 操作起来又不够简便. 下面介绍一种方法, 实现列数据多行显示, 即实现列数据的自动折行.具体步骤如下:1) 在DataWindow Painter中打开此DataWindow.2) 在需设定自动折行的列上双击鼠标, 弹开此列的属性窗口.3) 选择Position标签, 选中Autosize Height 多选框.4) 选择Edit标签, 不选中Auto Horz Scroll多选框.5) 单击OK按钮, 保存所做的修改.6) 点中Detail Band (即写有Detail的灰色长带), 单击鼠标右键, 选择Properties... 菜单项.7) 选中Autosize Height多选框.8) 单击OK按钮, 保存所做的修改.9) 保存此DataWindow.注意:连在一起的汉字(中间没有标点或空格分隔), 系统将认为是一个单词, 不会自动进行折行.3 在数据窗口中实现动画要实现动画,必须要有定时器,在数据窗口中已经有了一个定时器,双击数据窗口将弹出的对话框,在Timer Interval中定义大于零的值就有定时器(可以精确到毫秒),有了这个定时器就可以实现动画了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P>Yield()函数是一个在 PB程序控制中非常有用的函数,如果能够合理使用它,一定可使你的程序操作友好很多。
Yield()函数的功能是将控制权转移给其它图形对象,包括非 PowerBuilder对象。
该函数检测消息队列,如果有消息,就把消息取出。
该函数返回布尔型值,如果在消息队列中提取到了消息,那么函数返回 TRUE,否则返回FALSE。
利用该函数可以在执行耗时较长的操作时把控制权转让给其它应用。
用法正常情况下, PowerBuilder应用程序在执行一段代码(比如正在检索数据或者执行一段循环程序)的过程中不响应用户的操作。
对耗时短暂的代码段来说,这种处理方式没有什么不妥的地方,但是,如果某个代码段的执行耗时较长(比如在大量数据检索或循环执行的代码中),应用程序又希望为用户提供更多的控制权,那么需要在这段代码中插入 Yield()函数,让用户能够进行其它操作,比如,允许用户按下其他窗口的“取消”按扭,而该按扭又改变了某个全局(共享)变量,在 Yield()函数接下来的代码中便可判断该全局(共享)变量的值,以决定下一步的操作。
应用程序执行 Yield()函数后,如果发现消息队列中存在消息,它将允许对象处理这些消息,处理之后,继续 Yield()函数后面代码的执行。
虽然用户在检索时不能做其他的事情,但是当你将 Yield()函数放在 RetrieveRow事件中时,用户能够同时运行其他的应用程序。
当然,代码中插入 Yield()函数将降低应用程序的运行效率。
示例 1.
下面的代码执行一段耗时较长的过程,在其中我们插入了 Yield()函数,当用户单击窗口上的“取消”按钮时,终止这段代码的执行,其中使用共享变量 sb_interrupt来指示用户是否单击了“取消”按钮:
integer n
// sb_interrupt是共享变量
sb_interrupt = FALSE
FOR n = 1 to 3000
Yield()
IF sb_interrupt THEN
// sb_interrupt的值在“取消”按钮的 Clicked事件处理程序中修改
MessageBox("调试 ","用户中断 !")
sb_interrupt = FALSE
EXIT
ELSE
... // 其它处理
END IF
NEXT
“取消”按钮的 Clicked事件处理程序可以写为: sb_interrupt = TRUE
示例 2.
在本例当中,程序在交互频诙 龃翱谕 笨梢源 淼谝桓龃翱诘氖录 H绻 挥衁ield()函数,用户也可以控制第二个窗口,但在循环完成之前不能看到窗口焦点的变化。
integer n
FOR n = 1 to 3000
Yield()
... // Some processing
NEXT
示例 3.
In this example, a script wants to open a DDE channel with Lotus Notes, whose executable name is stored in the variable mail
program. If the program isnt running, the script starts it and loops, waiti
ng until the programs startup is finished and it can establish a DDE channel. The loop includes Yield, so that the computer can spend time actually starting the other program:
time starttime
long hndl
SetPointer(HourGlass!)
//Try to establish a handle; SendMail is the topic.
hndl = OpenChannel("Notes","SendMail") //If the program is not running, start it
IF hndl $#@60; 1 then
Run(mailprogram, Minimized!)
starttime = Now()
// Wait up to 2 minutes for Notes to load
// and the user to log on.
DO
//Yield control occasionally.
Yield()
//Is Notes active yet?
hndl = OpenChannel("Notes","SendMail") // If Notes is active.
IF hndl $#@62; 0 THEN EXIT
LOOP Until SecondsAfter(StartTime,Now()) $#@62; 120
// If 2 minutes pass without opening a channel
IF hndl $#@60; 1 THEN
MessageBox("Error", &
"Cant start Notes.", StopSign!)
SetPointer(Arrow!) RETURN
END IF
END IF。