1.pop3协议解析及代码实现
2.Tornado之ioloop源码学习
3.c++队列的问题,学习图时在成员函数使用了pop(),但是无效,请问是什么原因?
4.jsp Poup弹出框
5.RocketMQ 5.0: POP 消费模式 原理详解 & 源码解析
6.python代ç 大å
¨ç®åï¼
pop3协议解析及代码实现
POP3,作为电子邮件接收的最新标准协议,是linux 下载源码包TCP/IP协议族中的客户端/服务器通信协议,由RFC规范。它允许客户端通过两个默认端口与服务器交互,执行一系列文本命令来获取邮件。 客户端向POP3服务器发送的命令包括:USER: 用于登录,用户名和密码以明文形式传输。
PASS: 输入密码,成功后进入处理阶段。
STAT: 显示邮件数量和大小,提供邮件状态信息。
LIST: 列出邮件摘要,显示每封邮件的大小和编号。
RETR: 下载邮件内容,服务器会显示成功响应和邮件大小。
QUIT: 结束会话,完成通信。
例如,通过Wireshark抓包,可以看到服务器对每个命令的响应,通常以"+OK"或"-ERR"开头,源码音乐和编程具体信息如邮件数量、大小或错误原因。 在实际操作中,如telnet到POP3服务器(如"telnet pop..com "),在输入相应的命令后,会得到服务器的确认或错误反馈。重要的是,密码在通信过程中是明文传输的,应谨慎处理。 要获取完整的源代码和报文示例,可以关注微信公众号程序猿编码,或直接联系作者获取更多信息(微信号c)。Tornado之ioloop源码学习
在闲暇之余,我研究了tornado的源码,并计划以系列文章的形式记录关键部分,旨在总结学习心得并可能对使用该框架的朋友有所帮助。如有疏漏,欢迎私信或评论指正。
在研究开源项目时,我通常选择原始版本的tornadoweb/tornado,因为我认为其核心功能通常在1.0.0版本就已经完备,后续的改进主要集中在细节,而非重大功能。代码风格的出击图指标源码统一性可能会因不同开发者提交的代码而有所差异。
在阅读之前,我建议您对Linux的IO模型有所了解,特别是epoll和kqueue(在Mac或BSD系统中)的概念。Python 2.6及以上版本的select库提供了相关实现,但2.6以下版本则需要依赖tornado对底层epoll的封装。以下代码正是处理这个选择过程的。
接下来,让我们深入探讨tornado的内部。首先,我们关注的是底层的 epoll 实现,如 GitHub 上的代码。它提供了常规的epoll功能,熟悉该技术的开发者一眼就能看懂。
然后是 IOLoop 类,我们从头开始分析。其中定义了 epoll 中的关键事件,如 _EPOLLIN 和 _EPOLLOUT,分别表示文件描述符的读写就绪状态。
在代码中,_set_close_exec 方法的作用是解决子进程 fork 后可能遇到的问题。当子进程仅被 fork 并执行 exec 时,原有的文件描述符可能会消失,这个方法确保在 exec 时关闭这些描述符。
r,力软 7.0.5 源码 w = os.pipe() 则创建了一个管道,用于高效地中断 IOLoop 循环。当管道另一端写入数据时,会阻塞 poll() 方法,从而停止循环。
此外,IOLoop 通过 signal 模块监控 block 时间,当超过设定时间,将执行预先定义的 handler。信号 SIGALRM 和 ITIMER_REAL 通常一起使用。
至关重要的 start 方法下,有几个辅助方法。_callbacks 存储了将在下一次 IOLoop 循环前调用的函数,保证跨线程安全。相比之下,_timeouts 保存了执行函数和截止时间的对应关系,允许延迟执行。
关于 poll_timeout 的设置,它决定了 IOLoop 等待就绪事件的时间。默认值为 0.2 秒,如果存在可以执行的回调,会调整为尽快执行。最后,IOLoop 通过 poll 函数获取就绪事件,使用 signal.ITIMER_REAL 进行计时,能看到apk源码处理后利用 pop 方法而非遍历,避免映射关系在处理过程中变化。
以上就是对 IOLoop 的基本介绍,期待你的反馈和指正。
c++队列的问题,学习图时在成员函数使用了pop(),但是无效,请问是什么原因?
问题在于你的queue<int> adj(int v) 函数返回的是一个queue的拷贝,而不是queue本身。
改成
queue <int>& adj(int v) //获取和顶点v相邻的所有顶点
{
return adjacent[v];
}
全部源码如下:
#include<iostream>
#include<queue>
using namespace std;
class Graph {
public:
Graph(int v) //创建一个包含v个顶点但不包含边的图
{
this -> adjacent = new queue < int > [v];
this -> V = v;
this -> E = 0;
}
int Vnum() //获取顶点的数量
{
return this -> V;
}
int Enum() //获取边的数量
{
return this -> E;
}
void addEdge(int v, int w)
//向图中增加一条边 v-w
{
this -> adjacent[v].push(w);
this -> adjacent[w].push(v);
this -> E++;
}
queue <int>& adj(int v) //获取和顶点v相邻的所有顶点
{
return adjacent[v];
}
private:
int V; //顶点数量
int E; //顶点边数量
queue < int > * adjacent;
};
class DepthFirstSearch {
public:
DepthFirstSearch(Graph G, int s) { //构件深度优先搜索对象,利用深度优先搜索找出G图中s顶点的所有相同顶点
this -> marked = new bool[G.Vnum()];
for (int i = 0; i < G.Vnum();
++i) {
marked[i] = false;
}
this -> N = 0;
dfs(G, s);
}
void dfs(Graph G, int v) //利用深度优先搜索找出G中v顶点的所有相通顶点
{
marked[v] = true;
int w = G.adj(v).front();
while (!G.adj(v).empty()) //找到v队列里的内容
{
if (!marked[w]) {
dfs(G, w);
}
cout << "队列大小:" << G.adj(v).size() << endl;
G.adj(v).pop();
cout << "队列删除后的大小:" << G.adj(v).size() << endl;
if (G.adj(v).empty() == 1) {
break;
}
w = G.adj(v).front();
}
this -> N++;
//N加1 的位置放在当前节点变true的时候
}
bool mark(int w) //判断w与s是否相通
{
return marked[w];
}
int count() {
return N;
}
private: bool * marked; //索引代表顶点,值表示当前顶点是否已经被搜索
int N; //记录有多少个顶点与s顶点相同
};
int main() {
Graph g();
g.addEdge(0, 6);
g.addEdge(0, 2);
g.addEdge(0, 1);
g.addEdge(0, 6);
g.addEdge(5, 3);
g.addEdge(5, 4);
g.addEdge(3, 4);
g.addEdge(4, 6);
g.addEdge(7, 8);
g.addEdge(9, );
g.addEdge(9, );
g.addEdge(, );
g.addEdge(9, );
DepthFirstSearch * DFS = new DepthFirstSearch(g, 0);
int num = DFS -> count();
cout << num << endl;
return 0;
}
jsp Poup弹出框
其实代码非常简单:
<SCRIPT LANGUAGE=javascript>
<!--
window.open ('page.html')
-->
</SCRIPT>
因为这是一段javascript代码,所以它们应该放在<SCRIPT LANGUAGE=javascript>标签和</script>之间。<!-- 和 -->是对一些版本低的浏览器起作用,在这些老浏览器中不会将标签中的代码作为文本显示出来。要养成这个好习惯啊。
window.open ('page.html') 用于控制弹出新的窗口page.html,如果page.html不与主窗口在同一路径下,前面应写明路径,绝对路径(http://)和相对路径(../)均可。
用单引号和双引号都可以,只是不要混用。
这一段代码可以加入HTML的任意位置,<head>和</head>之间可以,<body>间</body>也可以,越前越早执行,尤其是页面代码长,又想使页面早点弹出就尽量往前放。
2、经过设置后的弹出窗口
下面再说一说弹出窗口的设置。只要再往上面的代码中加一点东西就可以了。我们来定制这个弹出的窗口的外观,尺寸大小,弹出的位置以适应该页面的具体情况。
<SCRIPT LANGUAGE=javascript>
<!--
window.open ('page.html', 'newwindow', 'height=, width=, top=0, left=0, toolbar=no, menubar=no, scrollbars=no, resizable=no,location=no, status=no')
//写成一行
-->
</SCRIPT>
参数解释:
<SCRIPT LANGUAGE=javascript> js脚本开始;
window.open 弹出新窗口的命令;
'page.html' 弹出窗口的文件名;
'newwindow' 弹出窗口的名字(不是文件名),非必须,可用空''代替;
height= 窗口高度;
width= 窗口宽度;
top=0 窗口距离屏幕上方的象素值;
left=0 窗口距离屏幕左侧的象素值;
toolbar=no 是否显示工具栏,yes为显示;
menubar,scrollbars 表示菜单栏和滚动栏。
resizable=no 是否允许改变窗口大小,yes为允许;
location=no 是否显示地址栏,yes为允许;
status=no 是否显示状态栏内的信息(通常是文件已经打开),yes为允许;
</SCRIPT> js脚本结束
3、用函数控制弹出窗口
下面是一个完整的代码。
<html>
<head>
<script LANGUAGE=javascript>
<!--
function openwin() {
window.open (page.html, newwindow, height=, width=, toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no)
//写成一行
}
//-->
</script>
</head>
<body onload=openwin()>
..任意的页面内容...
</body>
</html>
这里定义了一个函数openwin(),函数内容就是打开一个窗口。在调用它之前没有任何用途。
怎么调用呢?
方法一:<body onload=openwin()> 浏览器读页面时弹出窗口;
方法二:<body onunload=openwin()> 浏览器离开页面时弹出窗口;
方法三:用一个连接调用:
<a href=注意:使用的“ 方法四:用一个按钮调用:
<input type=button onclick=openwin() value=打开窗口>
4、同时弹出2个窗口
对源代码稍微改动一下:
<script LANGUAGE=javascript>
<!--
function openwin() {
window.open (page.html, newwindow, height=, width=, top=0, left=0,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no)
//写成一行
window.open (page2.html, newwindow2, height=, width=, top=, left=,toolbar=no, menubar=no, scrollbars=no, resizable=no, location=no, status=no)
//写成一行
}
//-->
</script>
为避免弹出的2个窗口覆盖,用top和left控制一下弹出的位置不要相互覆盖即可。最后用上面说过的四种方法调用即可。
注意:2个窗口的name(newwindows和newwindow2)不要相同,或者干脆全部为空。OK?
5、主窗口打开文件1.htm,同时弹出小窗口page.html
如下代码加入主窗口<head>区:
<script language=javascript>
<!--
function openwin() {
window.open(page.html,,width=,height=)
}
//-->
</script>
加入<body>区:
<a href=1.htm onclick=openwin()>open</a>即可。
6、弹出的窗口之定时关闭控制
下面我们再对弹出的窗口进行一些控制,效果就更好了。如果我们再将一小段代码加入弹出的页面(注意是加入到page.html的HTML中,可不是主页面中,否则...),让它秒后自动关闭是不是更酷了?
首先,将如下代码加入page.html文件的<head>区:
<script language=javascript>
function closeit() {
setTimeout(self.close(),) //毫秒
}
</script>
然后,再用<body onload=closeit()> 这一句话代替page.html中原有的<BODY>这一句就可以了。(这一句话千万不要忘记写啊!这一句的作用是调用关闭窗口的代码,秒钟后就自行关闭该窗口。)
7、在弹出窗口中加上一个关闭按钮
<FORM>
<INPUT TYPE='BUTTON' value='关闭' onClick='window.close()'>
</FORM>
呵呵,现在更加完美了!
8、内包含的弹出窗口-一个页面两个窗口
上面的例子都包含两个窗口,一个是主窗口,另一个是弹出的小窗口。
通过下面的例子,你可以在一个页面内完成上面的效果。
<html>
<head>
<SCRIPT LANGUAGE=javascript>
function openwin()
{
OpenWindow=window.open(, newwin, height=, width=,toolbar=no,scrollbars=+scroll+,menubar=no);
//写成一行
OpenWindow.document.write(<TITLE>例子</TITLE>)
OpenWindow.document.write(<BODY BGCOLOR=OpenWindow.document.write(<h1>Hello!</h1>)
OpenWindow.document.write(New window opened!)
OpenWindow.document.write(</BODY>)
OpenWindow.document.write(</HTML>)
OpenWindow.document.close()
}
</SCRIPT>
</head>
<body>
<a href=<input type=button onclick=openwin() value=打开窗口>
</body>
</html>
看看 OpenWindow.document.write()里面的代码不就是标准的HTML吗?只要按照格式写更多的行即可。千万注意多一个标签或少一个标签就会出现错误。记得用OpenWindow.document.close()结束啊。
9、终极应用--弹出的窗口之Cookie控制
回想一下,上面的弹出窗口虽然酷,但是有一点小毛病(沉浸在喜悦之中,一定没有发现吧?)比如你将上面的脚本放在一个需要频繁经过的页面里(例如首页),那么每次刷新这个页面,窗口都会弹出一次,是不是非常烦人?:-(
有解决的办法吗?Yes! ;-) Follow me.
我们使用cookie来控制一下就可以了。
首先,将如下代码加入主页面HTML的<HEAD>区:
<script>
function openwin(){
window.open(page.html,,width=,height=)
}
function get_cookie(Name) {
var search = Name + =
var returnvalue = ;
if (documents.cookie.length > 0) {
offset = documents.cookie.indexOf(search)
if (offset != -1) {
offset += search.length
end = documents.cookie.indexOf(;, offset);
if (end == -1)
end = documents.cookie.length;
returnvalue=unescape(documents.cookie.substring(offset, end))
}
}
return returnvalue;
}
function loadpopup(){
if (get_cookie('popped')==''){
openwin()
documents.cookie=popped=yes
}
}
</script>
然后,用<body onload=loadpopup()>(注意不是openwin而是loadpop啊!)替换主页面中原有的<BODY>这一句即可。你可以试着刷新一下这个页面或重新进入该页面,窗口再也不会弹出了
RocketMQ 5.0: POP 消费模式 原理详解 & 源码解析
RocketMQ 5.0 引入 Pop 消费模式,用于解决 Push 消费模式存在的痛点。Pop 消费模式将客户端的重平衡逻辑迁移至 Broker 端,使得消息消费过程更加高效,避免消息堆积和横向扩展能力受限的问题。引入轻量化客户端后,通过 gRPC 封装 Pop 消费接口,实现了多语言支持,无需在客户端实现重平衡逻辑。
Pop 消费模式的原理在于客户端仅需发送 Pop 请求,由 Broker 端根据请求分配消息队列并返回消息。这样可以实现多客户端同时消费同一队列,避免单一客户端挂起导致消息堆积,同时也消除了频繁重平衡导致的消息积压问题。
Pop 消费流程涉及消息拉取、不可见时间管理、消费失败处理和消息重试等关键环节。消息拉取时,系统会为一批消息生成 CheckPoint,并在 Broker 内存中保存,以便与 ACK 消息匹配。消息不可见时间机制确保在规定时间内未被 ACK 的消息将被重试。消费失败时,客户端通过修改消息不可见时间来调整重试策略。当消费用时超过预设时间,Broker 也会将消息放入重试队列。通过定时消息,Broker 可以提前消费重试队列中的消息,与 ACK 消息匹配,实现高效消息处理。
在 Broker 端,重平衡逻辑也进行了优化。Pop 模式的重平衡允许多个消费者同时消费同一队列,通过 popShareQueueNum 参数配置额外的负载获取队列次数。Pop 消息处理涉及从队列中 POP 消息、生成 CheckPoint 用于匹配 ACK 消息、以及存储 CheckPoint 与 Ack 消息匹配。Broker 端还通过 PopBufferMergeService 线程实现内存与磁盘中的 CheckPoint 和 Ack 消息匹配,以及消息重试处理。
源码解析部分涉及 Broker 端的重平衡逻辑、Pop 消息处理、Ack 消息处理、CheckPoint 与 Ack 消息匹配逻辑等关键组件的实现细节,这些细节展示了 RocketMQ 5.0 如何通过优化消费模式和流程设计,提升消息消费的效率和稳定性。
python代ç å¤§å ¨ç®åï¼
pythonæ趣çç¼ç¨ä»£ç
class?Point:
row=0col=0def?__init__(self,?row,?col):self.row=row
self.col=col
def?copy(self):return?Point(row=self.row,?col=self.col)
#åå§æ¡æ¶
import?pygame
import?random
#åå§å
pygame.init()
W=
H=
ROW=
COL=
size=(W,H)
window=pygame.display.set_mode(size)
pygame.display.set_caption('è´ªåè')
bg_color=(,,)
snake_color=(,,)
head=Point(row=int(ROW/2),?col=int(COL/2))
head_color=(0,,)
snakes=[
Point(row=head.row,?col=head.col+1),Point(row=head.row,?col=head.col+2),Point(row=head.row,?col=head.col+3)]
#çæé£ç©
def?gen_food():
while?1:pos=Point(row=random.randint(0,ROW-1),?col=random.randint(0,COL-1))
#
is_coll=False
#æ¯å¦è·è碰ä¸äº
if?head.row==pos.row?and?head.col==pos.col:
is_coll=True#è身å
for?snake?in?snakes:
if?snake.row==pos.row?and?snake.col==pos.col:is_coll=True
break
if?not?is_coll:
breakreturn?pos#å®ä¹åæ
food=gen_food()
food_color=(,,0)
direct='left'#left,right,up,down
#
def?rect(point,?color):
cell_width=W/COLcell_height=H/ROWleft=point.col*cell_widthtop=point.row*cell_heightpygame.draw.rect(window,?color,
(left,?top,?cell_width,?cell_height)
)pass#游æ循ç¯
quit=True
clock=pygame.time.Clock()
while?quit:
#å¤çäºä»¶for?event?in?pygame.event.get():if?event.type==pygame.QUIT:
quit=Falseelif?event.type==pygame.KEYDOWN:
if?event.key==?or?event.key==:if?direct=='left'?or?direct=='right':
direct='up'elif?event.key==?or?event.key==:if?direct?==?'left'?or?direct?==?'right':
direct='down'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='left'elif?event.key==?or?event.key==:if?direct?==?'up'?or?direct?==?'down':
direct='right'#åä¸è¥¿eat=(head.row==food.row?and?head.col==food.col)#éæ°äº§çé£ç©if?eat:food?=?gen_food()
#å¤ç身å#1.æåæ¥ç头ï¼æå ¥å°snakesç头ä¸snakes.insert(0,?head.copy())#2.æsnakesçæåä¸ä¸ªå æif?not?eat:snakes.pop()
#移å¨if?direct=='left':head.col-=1
elif?direct=='right':head.col+=1
elif?direct=='up':head.row-=1
elif?direct=='down':head.row+=1
#æ£æµdead=False#1.æå¢if?head.col0?or?head.row0?or?head.col=COL?or?head.row=ROW:dead=True
#2.æèªå·±for?snake?in?snakes:if?head.col==snake.col?and?head.row==snake.row:
dead=Truebreakif?dead:print('æ»äº')
quit=False
#渲æââç»åºæ¥#èæ¯pygame.draw.rect(window,?bg_color,?(0,0,W,H))#è头for?snake?in?snakes:rect(snake,?snake_color)
rect(head,?head_color)rect(food,?food_color)#pygame.display.flip()#设置帧é¢ï¼é度ï¼clock.tick(8)#æ¶å°¾å·¥ä½
è¿æ¯ä¸ä¸ªç®æçè´ªåèç代ç ï¼è½ç¶ç»æç®åï¼ä½æ¯è¯¥æçåè½é½æ¯å®æ´çï¼å¯ç©æ§ä¹ä¸é
æ±pythonæ°æ®æ åå代ç ï¼ä½¿ç¨pythonæ ååæ°æ®ç代ç å¦ä¸ï¼
fromsklearnimportpreprocessing
importnumpyasnp
X=np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
X_scaled=preprocessing.scale(X)
print(X_scaled)
pythonå£è¯æ 代ç ç®å```python#Pythonå£è¯æ 代ç foriinrange(1,6):forjinrange(1,i+1):print('*',end='')print('\n')```
æå±ï¼å¦ææ³æ¹åæ çå½¢ç¶ï¼å¯ä»¥å¨ä»£ç ä¸æ·»å æ´å¤çæ§å¶åæ°ï¼å¦å¨æ¯ä¸è¡ä¸æ·»å ä¸åçç©ºæ ¼æ°ï¼ä½¿å¾æ çå½¢ç¶ä¸ä¸æ ·ãåæ¶å¯ä»¥éè¿æ·»å HTMLæ ç¾ï¼ä½¿ç¨CSSæ ·å¼æ¥æ¹åå£è¯æ çé¢è²ãèæ¯åæåççã
个æç®python代ç ï¼æ¿èµ°å³ç¨
Helloï¼å¤§å®¶å¥½ï¼ææ¯ç¨åºæ±ªå°æ~
è½ç¶pythonæ¯ä¸ä¸ªæå ¥é¨çè¯è¨ï¼ä½æ¯å¾å¤äººä¾ç¶è¿æ¯ä¼é®å°åºæä¹æ ·å¦Pythonææå¿«ï¼çæ¡å½ç¶æ¯å®æåç§å°é¡¹ç®ï¼åªæèªå·±å»æ³ä¸åï¼æè®°å¾ä½è§åãæ¬æåçæ¯ä¸ªæç®ä»»å¡ï¼åå¦è å¯ä»¥å°è¯çèªå·±å®ç°ï¼æ¬æåæ ·ä¹æ¯æ®µä»£ç ï¼Pythonå¼åè ä¹å¯ä»¥ççæ¯ä¸æ¯æ没æ³å°çç¨æ³ã
以ä¸æ¹æ³å¯ä»¥æ£æ¥ç»å®å表æ¯ä¸æ¯åå¨éå¤å ç´ ï¼å®ä¼ä½¿ç¨set()å½æ°æ¥ç§»é¤ææéå¤å ç´ ã
ç»å®å ·ä½ç大å°ï¼å®ä¹ä¸ä¸ªå½æ°ä»¥æç §è¿ä¸ªå¤§å°åå²å表ã
è¿ä¸ªæ¹æ³å¯ä»¥å°å¸å°åçå¼å»æï¼ä¾å¦ï¼Falseï¼Noneï¼0ï¼ââï¼ï¼å®ä½¿ç¨filter()å½æ°ã
æ们常ç¨For循ç¯æ¥éåæ个å表ï¼åæ ·æ们ä¹è½æ举å表çç´¢å¼ä¸å¼ã
å¦ä¸ä»£ç 段å¯ä»¥å°æå 好çæ对å表解å¼æ两ç»ä¸åçå ç»ã
该æ¹æ³å°éè¿éå½çæ¹å¼å°å表çåµå¥å±å¼ä¸ºå个å表ã
该æ¹æ³å°è¿å第ä¸ä¸ªå表çå ç´ ï¼ä¸ä¸å¨ç¬¬äºä¸ªå表å ãå¦æåæ¶è¦åé¦ç¬¬äºä¸ªå表ç¬æçå ç´ ï¼è¿éè¦å ä¸å¥set_b.difference(set_a)ã
å¦ä¸ä»£ç åå¯ä»¥ç¨æ¥è®¡ç®æ§è¡ç¹å®ä»£ç æè±è´¹çæ¶é´ã
该ç®æ³ä¼æä¹±å表å ç´ ç顺åºï¼å®ä¸»è¦ä¼éè¿Fisher-Yatesç®æ³å¯¹æ°å表è¿è¡æåºï¼
ä¸éè¦é¢å¤çæä½å°±è½äº¤æ¢ä¸¤ä¸ªåéçå¼ã
以ä¸ï¼æ¯æç®åå举çå个pythonæç®ä»£ç ï¼æ¿èµ°å³ç¨ï¼å¸æå¯¹ä½ ææ帮å©ï¼
pythonæ°æ代ç æåªäºï¼pythonæ°æ代ç æå¦ä¸ï¼
defnot_emptyï¼sï¼ã
returnsandlenï¼sãstripï¼ï¼ï¼0ã
#returnsandsãstripï¼ï¼ã
#å¦æç´æ¥ååsãstripï¼ï¼é£ä¹så¦ææ¯Noneï¼ä¼æ¥éï¼å 为None没æstripæ¹æ³ã
#å¦æsæ¯Noneï¼é£ä¹Noneandä»»ä½å¼é½æ¯Falseï¼ç´æ¥è¿åfalseã
#å¦æséNoneï¼é£ä¹å¤å®sãtripï¼ï¼æ¯å¦ä¸ºç©ºã
ç¸å ³ç®ä»ã
Python解éå¨æäºæ©å±ï¼å¯ä»¥ä½¿ç¨CæC++ï¼æè å ¶ä»å¯ä»¥éè¿Cè°ç¨çè¯è¨ï¼æ©å±æ°çåè½åæ°æ®ç±»åãPythonä¹å¯ç¨äºå¯å®å¶å软件ä¸çæ©å±ç¨åºè¯è¨ãPython丰å¯çæ ååºï¼æä¾äºéç¨äºå个主è¦ç³»ç»å¹³å°çæºç ææºå¨ç ã
å¹´æï¼è¯è¨æµè¡ææ°çç¼è¯å¨Tiobeå°Pythonå å为æå欢è¿çç¼ç¨è¯è¨ï¼å¹´æ¥é¦æ¬¡å°å ¶ç½®äºJavaãCåJavaScriptä¹ä¸ã
è´¨æ°è¡¨ä»£ç ï¼è´¨æ°è¡¨ä»£ç æ¯æç¨ç¼ç¨è¯è¨çæä¸ç³»åè´¨æ°ç代ç ãè´¨æ°æ¯æåªè½è¢«èªèº«å1æ´é¤çèªç¶æ°ï¼å¦2ï¼3ï¼5ï¼7çã
ä¸åçç¼ç¨è¯è¨æä¸åçå®ç°æ¹æ³ï¼æå¯ä»¥ç»ä½ ä¸äºåèã以ä¸æ¯ä¸äºç½ä¸æç´¢å°çè´¨æ°è¡¨ä»£ç 示ä¾ï¼
Cè¯è¨ï¼
#includestdio.hintmain(){ ?inti,j;?printf("2\n");?for(i=3;i=;i+=2)//ä»3å¼å§éåå¥æ°
{ for(j=3;ji;j++)//å¤ææ¯å¦è½è¢«å°äºå®çå¥æ°æ´é¤{ ?if(i%j==0)//å¦æè½æ´é¤ï¼åè·³åºå¾ªç¯
break;
}if(j==i)//å¦æ循ç¯æ£å¸¸ç»æï¼å说ææ¯è´¨æ°ï¼æå°åºæ¥
printf("%d\n",i);}?return0;}
Pythonï¼
#!/usr/bin/python#-*-coding:UTF-8-*-
#è¾åºæå®èå´å çç´ æ°
#ç¨æ·è¾å ¥æ°æ®lower=int(input("è¾å ¥åºé´æå°å¼:"))
upper=int(input("è¾å ¥åºé´æ大å¼:"))
fornuminrange(lower,upper+1):?#ç´ æ°å¤§äº1
ifnum1:foriinrange(2,num):?if(num%i)==0:breakelse:?print(num)