Start 1

认识什么是linux 系统。linux系统是类unix操作系统,unix是由AT&T公司下属的贝尔实验室员工开发。一开始是为了解决多任务线程问题,当系统一开始被开发出来时。AT&T公司并没有嗅到商业的气息。它前期只是被拿来用于高校学生学习使用。一开始源码都是免费使用。可后来随着发展,公司看到了它的商业价值,于是停止了对所有使用者的免费授权使用。不再允许高校的老师用它来教学。人们想法总是不同的,其中一些熟悉unix 系统的大佬。重新鼓捣了下,写出来与unix 相似的内核,还有gcc 编译器,他们成立了一个机构GNU 致力于免费开源的操作系统。任何人都可以使用他们的底层源码,使用者必须将自己修改的代码也进行开源对所有人都开放,不允许收取费用。由于开源的原因,许多人参与了进来。有一个叫林纳斯:托瓦兹 的大学生也参与了进来。他一个人使用GUN提供的内核等基础代码,开发出了大名鼎鼎的Linux系统。Linux系统对所有人也是开源的。任何人任何机构都可以免费使用。linux也发布了许多发行版。其中使用很广泛的有Ubuntu版本。linux使用的很广泛,任何安卓手机的操作系统,所有最底层的内核都是基于linux,如今网站的服务器上运行的也都是Linux操作系统。

Linux下简单的命令行 ls: 列举出此目录下的文件
touch xxx : 创建文件
mkdir xxx : 创建文件夹
rm xxx: : 删除文件
rm xxx -r : 删除文件夹
mv xxx xxx : 移动源文件或文件夹到目标文件或文件夹
cp xxx xxx : 复制源文件到目标文件,当当前目录没有目标文件时创建目标文件,并将源文件复制到目标文件

Linux下Vi的使用 vi xxx : 创建并打开一个文件
i :输入模式
esc : 退出输入模式进入命令行模式
w : 保存刚编辑的文件
q : 退出vi 编辑器
q ! : 强制退出
使用 gcc 编译器 gcc xxx 编译文件 (例如:gcc main.c )

当编译文件后会生成一个可执行文件, 默认的是 a.out
可以改变默认生成的可执行文件名 gcc main.c -oapp 则会生成一个名字叫app的可执行文件。
在linux 下可执行文件显示为绿色。

CPU 里面只有加法电路没有减法电路,当要运行减法运算时,则是加上一个负数也就是,正数的补码(二进制位取反在加一)

0000 0000 0000 0000 0000 0000 0110 0100
0x00000064 (100)

1111 1111 1111 1111 1111 1111 1001 1100
0x ffffff9d (-100)

八进制 以0开头 076表示 十进制62 (八进制表示时为0到7,不可以超过7 否则出错)。
无符号 int型变量 最大值为0x7fffffff 为2的31次方减1
最小值为0x80000000 为负的2的31次方
最小值减一会变为最大值, 最大值加一则会变为最小值。
一定要注意内存溢出问题, 会溢出时编译器编译不会出错,语法检查不出错误。

c语言变量赋整型值只可以用 八进制, 十进制, 十六进制 。

<think>我们有一个条件分支结构,根据`jingxing`和`yushi`的值是否为NaN(使用pd.notna和pd.isna判断)来设置多个变量(start1, finish1, start2, finish2, start3)的值。 目前代码有四个分支: 1. jingxing和yushi都不为NaN 2. jingxing不为NaN,yushi为NaN 3. jingxing为NaN,yushi不为NaN 4. 两者都为NaN 注意到在四个分支中,start3的赋值情况: 分支1: start3 = yushi 分支2: start3 = jingxing 分支3: start3 = yushi 分支4: start3 = pcc 另外,start1, finish1, start2, finish2的赋值也有规律。 我们可以尝试将start3的赋值独立出来,然后根据条件分别设置其他变量。但这里我们也可以观察到,实际上每个分支中,start3的值只与yushi和jingxing是否缺失有关,并且pcc在最后一种情况中作为start3的默认值。 但是,仔细观察,我们发现分支2和分支3中,start3分别被赋值为jingxing和yushi,而分支1start3被赋值为yushi(注意分支1中yushi不为空,所以用yushi),分支4中start3被赋值为pcc。 因此,我们可以这样考虑: start3 = yushi if pd.notna(yushi) else (jingxing if pd.notna(jingxing) else pcc) 但是,这样写并不能完全覆盖原逻辑,因为原逻辑中: 分支2:当yushi为NaN而jingxing不为NaN时,start3 = jingxing 分支3:当jingxing为NaN而yushi不为NaN时,start3 = yushi 分支1:都不为NaN,start3 = yushi 分支4:都为NaN,start3 = pcc 所以上面的条件表达式确实可以满足start3的赋值。 然后我们再看其他变量: 在分支1start1 = pcc finish1 = start2 = jingxing finish2 = yushi (注意这里,原代码中finish2被赋值为yushi,同时start3=yushi,所以finish2等于start3?但是原代码中并没有finish2与start3的关系,所以我们保留原赋值) 但是,我们注意到在分支1中,finish2被赋值为yushi,而start3也被赋值为yushi,所以finish2等于start3。同样,在分支3中,finish2被赋值为yushi,而start3也是yushi,所以相等。 然而,在分支2中,finish1被赋值为jingxing,同时start3也是jingxing,所以finish1等于start3。 因此,我们可以这样归纳: 我们定义: start3 = yushi if pd.notna(yushi) else (jingxing if pd.notna(jingxing) else pcc) 然后,我们观察: start1和finish1:只在分支1和分支2中被赋值(分支1start1=pcc, finish1=jingxing;分支2:start1=pcc, finish1=jingxing;分支3和4中,start1和finish1都为NaN或部分为NaN) start2和finish2:只在分支1和分支3中被赋值(分支1start2=jingxing, finish2=yushi;分支3:start2=pcc, finish2=yushi;分支2和4中,start2和finish2为NaN) 因此,我们可以这样: if pd.notna(jingxing) and pd.notna(yushi): start1 = pcc finish1 = jingxing start2 = jingxing finish2 = yushi elif pd.notna(jingxing) and pd.isna(yushi): start1 = pcc finish1 = jingxing start2 = np.nan finish2 = np.nan elif pd.isna(jingxing) and pd.notna(yushi): start1 = np.nan finish1 = np.nan start2 = pcc finish2 = yushi else: start1 = np.nan finish1 = np.nan start2 = np.nan finish2 = np.nan start3 = yushi if pd.notna(yushi) else (jingxing if pd.notna(jingxing) else pcc) 但是,这样写并没有减少代码行数,而且重复写了start1, finish1, start2, finish2的赋值。 另一种思路:我们可以先给所有变量赋默认值(比如分支4的值),然后根据条件覆盖。 例如: start1 = np.nan finish1 = np.nan start2 = np.nan finish2 = np.nan start3 = pcc # 默认情况,如果后面有覆盖则覆盖 if pd.notna(jingxing): # 当jingxing不为空时,会影响到分支1和2 start1 = pcc finish1 = jingxing # 在分支1中,还需要设置start2和finish2(因为分支1中yushi不为空),但分支2中yushi为空,所以start2和finish2保持为nan(默认值) if pd.notna(yushi): start2 = jingxing finish2 = yushi elif pd.notna(yushi): # 当jingxing为空而yushi不为空(分支3) start2 = pcc finish2 = yushi # 重新设置start3:如果yushi不为空,则取yushi;否则如果jingxing不为空,则取jingxing;否则就是pcc(默认值) if pd.notna(yushi): start3 = yushi elif pd.notna(jingxing): start3 = jingxing else: start3 = pcc # 其实已经默认是pcc,这里可以省略,但为了清晰可以保留 注意:上面的分支结构先判断了`if pd.notna(jingxing)`,然后进入后判断yushi。然后有一个`elif pd.notna(yushi)`,这个elif是在jingxing为空的情况下判断yushi。 这样写可以覆盖所有情况,但是需要注意的是,在第一个if中,当jingxing不为空且yushi也不为空时,我们设置了start1, finish1, start2, finish2。然后第二个elif中,当jingxing为空且yushi不为空时,我们设置start2和finish2。 另外,start3的赋值独立出来,用三个条件判断。 但是,这样写实际上并没有比原代码更简洁,而且逻辑分散。 我们还可以考虑使用嵌套的三元表达式,但是那样可读性会降低。 因此,我们尝试另一种重构:使用字典来存储中间变量,然后一次性赋值。但可能也没必要。 实际上,原代码已经比较清晰,只是重复写了一些赋值语句。我们可以通过将公共部分提取出来来优化。 观察发现,在分支1和分支2中,start1和finish1的赋值是一样的:都是pcc和jingxing。而分支3和分支4中,start1和finish1都是nan(分支3中start1和finish1为nan,分支4也是)。同样,分支1和分支3中,finish2都被赋值为yushi(分支1start2=jingxing,分支3中start2=pcc),分支2和分支4中finish2为nan。 我们可以这样: # 先设置start1和finish1 if pd.notna(jingxing): start1 = pcc finish1 = jingxing else: start1 = np.nan finish1 = np.nan # 再设置start2和finish2 if pd.notna(yushi): # 在分支1和3中,finish2都是yushi,但start2不同: if pd.notna(jingxing): start2 = jingxing # 分支1 else: start2 = pcc # 分支3 finish2 = yushi else: start2 = np.nan finish2 = np.nan # 最后设置start3 if pd.notna(yushi): start3 = yushi elif pd.notna(jingxing): start3 = jingxing else: start3 = pcc 这样拆分后,代码逻辑更清晰,每个部分独立。但是,注意原代码中分支1和分支3中,finish2都是yushi,但在分支1中,start2被设置为jingxing(因为分支1中jingxing不为空),分支3中start2被设置为pcc(因为分支3中jingxing为空,但yushi不为空)。 因此,上面的拆分是符合原逻辑的。 我们还可以进一步简化,比如使用条件表达式: start1 = pcc if pd.notna(jingxing) else np.nan finish1 = jingxing if pd.notna(jingxing) else np.nan if pd.notna(yushi): start2 = jingxing if pd.notna(jingxing) else pcc finish2 = yushi else: start2 = np.nan finish2 = np.nan start3 = yushi if pd.notna(yushi) else (jingxing if pd.notna(jingxing) else pcc) 这样写更简洁。 但是,请注意原代码中,在分支1和3中,finish2都是yushi,并且分支1start2=jingxing,分支3中start2=pcc。所以上面start2的赋值使用了一个条件表达式:如果yushi不为空,那么start2就等于(如果jingxing不为空则取jingxing,否则取pcc)。这正好符合。 因此,我们可以将代码优化为: start1 = pcc if pd.notna(jingxing) else np.nan finish1 = jingxing if pd.notna(jingxing) else np.nan if pd.notna(yushi): start2 = jingxing if pd.notna(jingxing) else pcc finish2 = yushi else: start2 = np.nan finish2 = np.nan start3 = yushi if pd.notna(yushi) else (jingxing if pd.notna(jingxing) else pcc) 注意:原代码中,在分支1和2中,start1和finish1被赋值;在分支3中,start1和finish1为nan,所以上面的条件赋值是合理的。 但是,原代码中还有一点:在分支1中,finish1等于jingxing,同时start2也等于jingxing(即finish1start2指向同一个值)。而在分支3中,start2等于pcc,而start1和finish1为nan。所以我们的优化代码完全符合。 我们还可以将start2和finish2的赋值也改为条件表达式,但为了可读性,保留if-else也可以。 另外,原代码中有一个细节:在分支1中,finish1等于start2(都是jingxing),但我们的优化代码中并没有显式地要求finish1等于start2,而是分别赋值。不过逻辑上,当jingxing不为空且yushi也不为空时,finish1等于jingxing,而start2也等于jingxing,所以它们相等。同样,在分支2中,finish1等于jingxing,而start2为nan,所以不相等,这符合原逻辑。 因此,优化后的代码为: import numpy as np import pandas as pd # 假设pcc, jingxing, yushi是已经定义的变量 start1 = pcc if pd.notna(jingxing) else np.nan finish1 = jingxing if pd.notna(jingxing) else np.nan if pd.notna(yushi): start2 = jingxing if pd.notna(jingxing) else pcc finish2 = yushi else: start2 = np.nan finish2 = np.nan start3 = yushi if pd.notna(yushi) else (jingxing if pd.notna(jingxing) else pcc) 注意:原代码中有一个分支2,当yushi为空而jingxing不为空时,start3被赋值为jingxing,这由最后一行条件表达式保证(因为yushi为空,所以判断jingxing不为空,则取jingxing)。 但是,原代码中还有一个变量finish1start2的关系(在分支1中,finish1等于start2),但我们的代码中并没有强制这个关系。不过我们分别赋值,当条件满足时它们自然相等。 另外,原代码中分支1和分支2中,start3分别被赋值为yushi和jingxing,我们的代码也保证了这一点。 因此,这个优化版本是可行的,而且更简洁。 但是,请注意原代码中在分支1和分支3中,finish2等于start3(因为分支1中finish2=yushi, start3=yushi;分支3中finish2=yushi, start3=yushi),分支2中finish1等于start3(因为分支2中finish1=jingxing, start3=jingxing)。我们的优化代码中,这些关系也是满足的。 因此,我们最终给出优化后的代码。 但是,我们注意到原代码中还有两个变量:finish1start2。在原代码的分支1中,finish1等于start2(都是jingxing)。在优化代码中,我们分别赋值,当满足条件(jingxing不为空且yushi不为空)时,finish1=jingxing,start2=jingxing,所以相等。而当yushi不为空但jingxing为空时,start2=pcc,而finish1为NaN(因为jingxing为空),所以不相等。这与原分支3一致。 因此,优化代码正确。 但是,原代码中还有一行:在分支1中,finish1等于start2,同时start2还被用于作为start3的前一个变量?我们不需要关心,因为逻辑已经覆盖。 所以,最终代码如下: </think>要优化给定的条件分支代码,可以将其重构为更简洁、可读性更高的形式。以下是优化后的代码及解释: ### 优化后的代码 ```python start1 = pcc if pd.notna(jingxing) else np.nan finish1 = jingxing if pd.notna(jingxing) else np.nan start2 = jingxing if pd.notna(jingxing) and pd.notna(yushi) else ( pcc if pd.isna(jingxing) and pd.notna(yushi) else np.nan ) finish2 = yushi if pd.notna(yushi) else np.nan start3 = yushi if pd.notna(yushi) else ( jingxing if pd.notna(jingxing) else pcc ) ``` ### 优化解释 1. **分离变量赋值**: - 将相互独立的变量(`start1`/`finish1`、`start2`/`finish2`、`start3`)拆分成独立的条件赋值,避免冗余的`if-elif`分支。 - 每个变量直接通过条件表达式(三元运算符)赋值,逻辑更清晰。 2. **简化条件逻辑**: - `start1`和`finish1` 只依赖 `jingxing` 是否为空,可直接用三元表达式。 - `start2` 依赖 `jingxing` 和 `yushi` 的组合状态,通过嵌套三元表达式处理。 - `finish2` 只依赖 `yushi` 是否为空。 - `start3` 按优先级处理:`yushi` > `jingxing` > `pcc`。 3. **消除重复代码**: - 原始代码中多次出现的 `np.nan` 和重复赋值(如 `start2 = finish2 = np.nan`)被合并。 - 通过直接映射条件到赋值,减少分支嵌套。 4. **保持等效性**: - 优化后的代码严格等价于原始逻辑,覆盖所有四种分支情况: - 两者非空 → 分支1 - 仅`jingxing`非空 → 分支2 - 仅`yushi`非空 → 分支3 - 两者为空 → 分支4 ### 优化前后的逻辑对比 | 变量 | 原始分支逻辑 | 优化后逻辑 | |---------|------------------------------------------------|--------------------------------------------------------------------------| | `start1` | `pcc`(分支1/2),否则`np.nan` | `pcc if jingxing非空 else np.nan` | | `finish1`| `jingxing`(分支1/2),否则`np.nan` | `jingxing if jingxing非空 else np.nan` | | `start2` | `jingxing`(分支1),`pcc`(分支3),否则`nan` | `jingxing if 两者非空 else (pcc if yushi非空且jingxing空 else np.nan)` | | `finish2`| `yushi`(分支1/3),否则`np.nan` | `yushi if yushi非空 else np.nan` | | `start3` | `yushi`(分支1/3),`jingxing`(分支2),`pcc`(分支4) | `yushi if 非空 else (jingxing if 非空 else pcc)` | ### 优点 - **行数减少**:从15行降至9行。 - **可维护性**:修改单个变量逻辑时无需检查多个分支。 - **可读性**:变量赋值意图一目了然,避免深层嵌套。 ### 注意事项 - 当`jingxing`和`yushi`均为空时,`start3`会正确回退到`pcc`。 - 需确保导入`numpy`(`import numpy as np`)和`pandas`(`import pandas as pd`)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值