列表非空判断用or 其他多逻辑判断用| exec(globals())
  X5zJxoD00Cah 2023年11月02日 42 0

1 同样的内容 exec出错

python 查找list中包含字符串的元素

https://blog.csdn.net/cuisidong1997/article/details/116493137

dizh_ = r"E:\Program Files\fs\speed_dev\data\designer\speedProject\进销存报表"
gosi_ = '2030'
goch_1 = '2031'
goch_2 = '2032'
def hebi_fuzh(gosi_= gosi_, goch_1= goch_1, goch_2= goch_2):
    gosi_goch_1 = gosi_ + '-' + goch_1
    gosi_goch_2 = gosi_ + '-' + goch_2
    return gosi_goch_1, gosi_goch_2

def hebi_(ob_1= hebi_fuzh()[0], ob_2= hebi_fuzh()[1], dizh_= dizh_):
    listdir_ = os.listdir(dizh_)
    wj_1 = [ j for j in listdir_ if ob_1 in j ][0]
    wj_2 = [ j for j in listdir_ if ob_2 in j ][0]
    return wj_1, wj_2

hebi_() # 正确
'''
('ZFI077-2030-2031.xlsx', 'ZFI077-2030-2032.xlsx')
'''
import pandas as pd
import os
dizh_ = r"E:\Program Files\fs\speed_dev\data\designer\speedProject\进销存报表"
gosi_ = '2030'
goch_1 = '2031'
goch_2 = '2032'
def hebi_fuzh(gosi_= gosi_, goch_1= goch_1, goch_2= goch_2):
    gosi_goch_1 = gosi_ + '-' + goch_1
    gosi_goch_2 = gosi_ + '-' + goch_2
    return gosi_goch_1, gosi_goch_2

def hebi_(ob_1= hebi_fuzh()[0], ob_2= hebi_fuzh()[1], dizh_= dizh_):
    listdir_ = os.listdir(dizh_)
    for i in range(1,3):
        exec("wj_{} = [ j for j in listdir_ if ob_{} in j ][0]".format(i,i))
    return wj_1, wj_2

hebi_()

'''
NameError                                 Traceback (most recent call last)
<ipython-input-16-a94a41aeeea8> in <module>
     14     return wj_1, wj_2
     15 
---> 16 hebi_()

<ipython-input-16-a94a41aeeea8> in hebi_(ob_1, ob_2, dizh_)
     11     listdir_ = os.listdir(dizh_)
     12     for i in range(1,3):
---> 13         exec("wj_{} = [ j for j in listdir_ if ob_{} in j ][0]".format(i,i))
     14     return wj_1, wj_2
     15 

<string> in <module>

<string> in <listcomp>(.0)

NameError: name 'ob_1' is not defined
'''

解答 for ... exec("..=..") 在定义函数中使用 需要添加

经验: 遇到错误 需要关注错误类型

可尝试搜索 函数+错误类型

def fun_():
    for i in range(5):
        exec("var = {}".format(i))
        print(var)
fun_()
'''
NameError                                 Traceback (most recent call last)
Cell In[1], line 5
      3         exec("var = {}".format(i))
      4         print(var)
----> 5 fun_()

Cell In[1], line 4, in fun_()
      2 for i in range(5):
      3     exec("var = {}".format(i))
----> 4     print(var)

NameError: name 'var' is not defined
'''
def fun_():
    for i in range(5):
        exec("var = {}".format(i),globals())
        print(var)
fun_()

2 Python 中 (&,|)和(and,or)之间的区别

列表非空判断中 用 | 或运算符会报错 应当用or

其他情况多逻辑判断 用or会报错 应当用 |

https://blog.csdn.net/weixin_40041218/article/details/80868521

列表非空判断用or 其他多逻辑判断用| exec(globals())_python

列表非空判断用or 其他多逻辑判断用| exec(globals())_python_02

3 函数内部的全局变量以及exec的注意事项

问题 如果将:

exec("'wj_{} = {}\\{}.xlsx'".format(i,dizh_,j), globals())

分开写成

exec("wj_{} = dizh  +' \\' +'{}' +'.xlsx'".format(i,j), globals())

就会出错

(注意 上面仍然有错误 见4)

不完全正确解答:

def duqu_():
    
    '''全局变量'''
    global dizh_, list_wj, sht_, bool_duqu, wj_
    
    '''定义参数'''
    dizh_= r"D:\speedProject\进销存报表"
    list_wj = ['核对模板','ZFI077-2030','ZFI077-3030-3031']
    sht_ = '内部核对'
    bool_duqu = True
    for i,j in enumerate(list_wj):
        wj_ = dizh_ + '\\' + j + '.xlsx'
        exec("'wj_{} = {}\\{}.xlsx'".format(i,dizh_,j), globals())
        
        '''检查文件'''
        if os.path.exists(wj_) is not True:
            print(wj_, "文件缺失")
            bool_duqu = False
            break # 跳出循环
        
        '''读取文件'''
        if j== '核对模板':
            exec("df_{} = pd.read_excel(wj_, sht_)".format(i), globals())
        else:
            exec("df_{} = pd.read_excel(wj_)".format(i), globals())

列表非空判断用or 其他多逻辑判断用| exec(globals())_python_03

4

问题 wj_{}仍然无法作为全局变量读出

问题解决:因为wj_=被误写在"''"的最里面了 应该是exec("wj_{}= '' ")

正确答案

exec("wj_{} = '{}\\{}.xlsx'".format(i,dizh_,j), globals())

def duqu_():
    
    '''全局变量'''
    global dizh_, list_wj, sht_, bool_duqu
    
    '''定义参数'''
    dizh_= r"D:\speedProject\进销存报表"
    list_wj = ['核对模板','ZFI077-2030','ZFI077-3030-3031']
    sht_ = '内部核对'
    bool_duqu = True
    for i,j in enumerate(list_wj):
        exec("wj_{} = '{}\\{}.xlsx'".format(i,dizh_,j), globals())
        
        '''检查文件'''
        if os.path.exists(wj_) is not True:
            print(wj_, "文件缺失")
            bool_duqu = False
            break # 跳出循环
        
        '''读取文件'''
        if j== '核对模板':
            exec("df_{} = pd.read_excel(wj_{}, sht_)".format(i,i), globals())
        else:
            exec("df_{} = pd.read_excel(wj_{})".format(i,i), globals())

1,2,4的总结

dizh_变量在exec表达式里无法识别 需要format里读取

exec动态变量创建字符串 需要在字符串前面 例如 exec("变量{} = '表达式'")

exec创建全局变量, 添加参数globals()

函数创建全局变量,声明global

exec表达式的引号要谨慎

5 在局部变量中执行代码

https://python3-cookbook.readthedocs.io/zh_CN/latest/c09/p23_executing_code_with_local_side_effects.html

6 字符串与公式

a,b = 1,1
str_ = "a+b"
eval("str_".format()) # 
eval(str_.format()) # 返回值

7 公式转实际值

# import pandas as pd
df = pd.DataFrame([[1,2],[3,4]],columns= ['a','b'])
str_ = "df.a + df.b"
eval(str_)

df = pd.DataFrame([[1,2],[3,4]],columns= ['a','b'])
seri_str = pd.Series(["df.a + 1", "df.b - df.a"])
for i in seri_str.index:
    val_ = eval(seri_str.loc[i])
    print(val_)

列表非空判断用or 其他多逻辑判断用| exec(globals())_python_04

7 openai chatgpt 的解答

列表非空判断用or 其他多逻辑判断用| exec(globals())_python_05

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  X5zJxoD00Cah   2023年12月11日   26   0   0 知乎Python迭代器
  X5zJxoD00Cah   2023年12月12日   34   0   0 Python.net
X5zJxoD00Cah