您现在的位置是:网站首页 > 分类 > 文章详情

python大杂烩之深浅拷贝/列表生成式/global/lambda/非固定参数/递归/eval

T2019年4月9日 12:00175人围观
简介趁机总结下python中几百个知识点当中的6个点,下面开始走起

【深浅拷贝】
首先看下概念:
1、对于直接用等号赋值的,都是引用(以下输出的两个内存地址是一样的)

a = 'john'
b = a
print(id(a))
print(id(b))

2、对于数字、字符串,深浅拷贝只是内存的引用

a = 'john'
b = copy.deepcopy(a)
print(id(a))
print(id(b))

3、对于列表、元组、字典,浅拷贝只拷贝第一层,深拷贝会拷贝多次(也就是说使用copy,以下新老字典都回被修改,如果使用deepcopy只会修改新字典)

dic = {"name": "wu", "cpu": [80, ], "mem": [80, ], "disk": [80, ]}
new_dic = copy.copy(dic)
new_dic['cpu'][0] = 50
print(new_dic)
print(dic)

【GLOBAL】
当一个变量被定义在函数外部,但是你又想去改变它,那么需要在函数内部定义该变量为global

def gl():
    global wow
    wow = 100
wow = 1
gl()
print(wow)

【列表生成式】

# 简单的条件判断
lt = [x for x in range(10) if x % 2 == 0]
print(lt)
# 双重循环
lt2 = [m+n for m in range(10) for n in range(1, 5) if n % 2 == 0]
print(lt2)
# lt2相当于:
for m in range(10):
    for n in range(1, 5):
        if n % 2 == 0:
            print(m+n)
# 三元运算
a = [1, 2, 3, 4, 5]
lt3 = [x if x< 5 else 0 for x in a if x % 2 == 0]
print(lt3)

【LAMBDA】

from functools import reduce
# lambda表达式
# 基本使用
s = "this is\na\ttest"
print(s.split())
print(' '.join(s.split()))
la1 = (lambda s: ' '.join(s.split()))
print(la1("this is\na\ttest"))

# 入参是*返回一个元组,入参是**返回是字典
la2 = lambda *z: z
print(la2('Testing1', 'Testing2'))

# 在末尾直接传参 (101, 102)
print((lambda x, y: x if x > y else y)(101, 102))


# 嵌套使用
def inc(n):
    return lambda x: x+n
la4 = inc(5)
print(la4(6))

# 同map联合使用
la5 = map(lambda x: x**2, range(5))
print(list(la5))
# 同filter联合使用(返回结果为true的值)
print(list(filter(lambda x: x if x > 5 else '', range(10))))
# 同reduce联合使用(先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给fuction,最终返回一个结果值)
print(reduce(lambda x, y: x*y-4, range(4)))

【非固定参数】
这个直接看例子吧,也比较好懂,简单的使用就如下了:

def sendmsg(type, name, *args, **kwargs):
    print(type)
    print(name)
    print(args)
    print(kwargs)
sendmsg('wx', '李雷', '韩梅梅', cgl="okr")
# 调用后会输出  
wx
李雷
('韩梅梅',)
{'cgl': 'okr'}

【递归】
我觉得,递归一般用在多级菜单、树目录比较多
简单的举个例子,反转字符串,如下:

def func(s):
    if len(s) <1:
        return s
    return func(s[1:])+s[0]
result = func('abc')
print(result)

递归的执行顺序是,一层一层向下进入,然后将执行结果一层一层往上返回

ps:不要问我图片为什么倒了,练练脖子
【eval】
eval这东西还是比较好用的,但是有安全问题,慎用!!!
1)将字符串str当成有效的表达式来求值并返回计算结果

str='1+2*3'
# 以下输出一个7
print(eval)

2)list,tuple,dict和string相互转化

s = '[1,2]'
# 以下输出list类型  [1,2]
print(eval(s))

【列表和元组的区别】
元组的元素不能增改删,但是元组的元素的元素是可以被修改的。元组的方法有求指定元素的索引/求指定元素出现的次数
列表可以apped/count/sort/exend/index/insert/pop/reverse
【异常处理】

def mye( level ):
    if level < 1:
        raise Exception("Invalid level!")  # 主动抛出异常,后面必须要一个except Exception:去接住这个异常
        # 触发异常后,后面的代码就不会再执行
        print('这里不会打印了!')
try:
    mye(0)  # 触发异常
except Exception:
    print(1)
else:
    print(2)


这个时候,我们可以自己去定义一个简单的异常类

# 自定义异常类
class MyException(Exception):
    def __init__(self, msg):
        self.msg = msg

    def __str__(self):
        return self.msg + 'Error'


try:
    raise MyException('异常!')
except Exception as e:
    print(e)

文章评论

阿里云-云大使推广
阿里云-云服务器推广

微信公众号