鱼C论坛

 找回密码
 立即注册
查看: 2457|回复: 5

[已解决]代码运行有先后顺序吗

[复制链接]
发表于 2018-3-25 13:12:20 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
能具体点吗举个例子
例如a=3     是将右边的值赋给左边,顺序是从右到左
若是函数嵌套是先运行内部函数,再运行外部函数?
是否还有其他运行顺序
最佳答案
2018-3-25 18:12:00
本帖最后由 tifa2018 于 2018-3-25 18:13 编辑

赋值很简单,就是把右边的值给左边的变量

关于函数的嵌套

我自己写的例子,你看下

  1. NAME = 'nicholas'
  2. def jack():
  3.     name = "jack"
  4.     print(name)
  5.     def pony():
  6.         name = "pony"
  7.         print(name)
  8.         def charles():
  9.             name = 'charles'
  10.             print(name)
  11.         print(name)
  12.         charles()
  13.     pony()
  14.     print(name)
  15. jack()
复制代码


输出结果
  1. jack
  2. pony
  3. pony
  4. charles
  5. jack
复制代码



执行过程如下图

多层嵌套函数的执行过程.png

执行顺序:1----2----3----3.1----3.2----3.3----3.4----3.3.1----
3.3.2----3.3.3----3.3.4----3.3.5--3.3.3.1--3.3.3.2----3.5

1 首先执行NAME = 'nicholas'语句,

2 加载def jack():函数到内存进行编译,但不执行

3 调用jack()函数,开始执行

3.1 执行name = "jack"语句

3.2 执行print(name)语句,这里由于没有global关键字,优先读取局部变量name = "jack",所以这里输出jack

3.3 加载def pony():函数到内存进行编译,但不执行

3.4 调用pony():函数,开始执行

3.3.1 执行name = "pony"语句,这里是一个局部变量

3.3.2 执行print(name)语句,这里由于没有global、nonlocal关键字,优先读取局部变量name = "pony",所以这里输出pony

3.3.3 加载charles():函数到内存进行编译,但不执行

3.3.4 执行print(name)语句,这里由于没有global、nonlocal关键字,优先读取同一层级的局部变量name = "pony",所以这里输出pony

3.3.5 调用charles():函数,开始执行

3.3.3.1 执行name = 'charles'语句,这里是个局部变量

3.3.3.2 执行print(name)语句,优先读取局部变量name = "charles",所以这里输出charles

~~charles():函数结束

~~pony():函数
3.5 执行执行print(name)语句,优先使用同层级的局部变量name = "jack",所以这里输出jack。
~~整体结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-25 13:16:40 | 显示全部楼层
那是符号优先级的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 13:34:22 | 显示全部楼层
a=3     是将右边的值赋给左边,顺序是从右到左  =号左边是被赋值的对象
函数嵌套先从外部进入内部
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 14:34:24 | 显示全部楼层
下表列出了从最高优先级到最低优先级的所有运算符,如下所示 -

序号        运算符                                                     描述
1        **                                                             指数(次幂)运算        (最高优先级)
2        ~ + -                                                     补码,一元加减(最后两个的方法名称是+@和-@)
3        * / % //                                                 乘法,除法,模数和地板除
4        + -       
5        >> <<                                                     向右和向左位移
6        &                                                             按位与
7        ^                                                             按位异或和常规的“OR”
8        <= < > >=                                             比较运算符
9        <> == !=                                             等于运算符
10        = %= /= //= -= += *= **=                     赋值运算符
11        is is not                                                     身份运算符
12        in not in                                                     成员运算符
13        not or and                                             逻辑运算符

如果是函数,就看那个函数在这些运算符的哪边,依旧遵守运算符优先级的规则。您可以自己多动手进行尝试。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-25 18:12:00 | 显示全部楼层    本楼为最佳答案   
本帖最后由 tifa2018 于 2018-3-25 18:13 编辑

赋值很简单,就是把右边的值给左边的变量

关于函数的嵌套

我自己写的例子,你看下

  1. NAME = 'nicholas'
  2. def jack():
  3.     name = "jack"
  4.     print(name)
  5.     def pony():
  6.         name = "pony"
  7.         print(name)
  8.         def charles():
  9.             name = 'charles'
  10.             print(name)
  11.         print(name)
  12.         charles()
  13.     pony()
  14.     print(name)
  15. jack()
复制代码


输出结果
  1. jack
  2. pony
  3. pony
  4. charles
  5. jack
复制代码



执行过程如下图

多层嵌套函数的执行过程.png

执行顺序:1----2----3----3.1----3.2----3.3----3.4----3.3.1----
3.3.2----3.3.3----3.3.4----3.3.5--3.3.3.1--3.3.3.2----3.5

1 首先执行NAME = 'nicholas'语句,

2 加载def jack():函数到内存进行编译,但不执行

3 调用jack()函数,开始执行

3.1 执行name = "jack"语句

3.2 执行print(name)语句,这里由于没有global关键字,优先读取局部变量name = "jack",所以这里输出jack

3.3 加载def pony():函数到内存进行编译,但不执行

3.4 调用pony():函数,开始执行

3.3.1 执行name = "pony"语句,这里是一个局部变量

3.3.2 执行print(name)语句,这里由于没有global、nonlocal关键字,优先读取局部变量name = "pony",所以这里输出pony

3.3.3 加载charles():函数到内存进行编译,但不执行

3.3.4 执行print(name)语句,这里由于没有global、nonlocal关键字,优先读取同一层级的局部变量name = "pony",所以这里输出pony

3.3.5 调用charles():函数,开始执行

3.3.3.1 执行name = 'charles'语句,这里是个局部变量

3.3.3.2 执行print(name)语句,优先读取局部变量name = "charles",所以这里输出charles

~~charles():函数结束

~~pony():函数
3.5 执行执行print(name)语句,优先使用同层级的局部变量name = "jack",所以这里输出jack。
~~整体结束
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-25 23:01:51 | 显示全部楼层
tifa2018 发表于 2018-3-25 18:12
赋值很简单,就是把右边的值给左边的变量

关于函数的嵌套

多谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 14:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表