python学习小记

#  print  的一些使用

# 1、逗号分隔打印多个
print('asd',',',1,'vsv')

# 2、加号  进行字符串相加
print('asd'+',',1,'vsv')

# 3、sep = "-"  使用制定的字符串进行链接字符
print('my','name','is','hexianmin',sep='-')

# 4、指定打印结束的字符     end = ''  可以替换掉换行符    可以使两个print之间默认的换行符取消
print('hello ',end='')   #取消了换行符
print('world')


# import导入重命名
# 1
import math

# 2 
import math as mt

# 3
from math import sqrt as mat

# 4 
from math import pow,sqrt  

# 5
from math import *


# 赋值魔法 :

# 1、序列解包
values = (1,2,3)
x,y,z = values
print(x,y,z)

# 当序列解包  左部个数少于右部  不处理会报错  但是用运算符  ( * ) 可以来收集多余的值  这样无需确保变量的个数相同
x0,*rest,y0 = values
print(x0,rest,y0)   #但是要注意的是  使用 * 收集到的值都是列表  

# 2、链式赋值
x1 = y1 = 10    #这样等价于 x1 = 10     y1 = 10

# 3、增强赋值
x2 = 2
foor = 'asd'
x2 += 1
foor *= 2
print(x2,foor)

# 4、赋值的一点小区别   下面两个列子  可以看出  链式赋值是指向同一个地址(也就是说对象是同一个)  而分别赋值是指向两个不同的地址  是不同的对象    用 is  和  == 进行判断区别很明显                                        
# 第一:  指向同一个对象
x11 = y11 = [1,2]
print(id(x11),id(y11))

# 第二:  指向不同对象
x11 = [1,2]
y11 = [1,2]
print(id(x11),id(y11))



# is  相同运算符     注意区别  is  和  ==  :  1、is 是检查两个对象是否相同(就是指向同一个地址)   2、 ==  是检查两个对象是否相等  地址不一样但是相等也为 True                                         
x11 = [1,2]
y11 = [1,2]
print(x11 is y11,'  ',x11 == y11)    #output: False    True    这个例子很明显看出来其中的区别


# 字符串 和 序列 的比较  是看顺序来比较的 (从左往右)  如下
'abcd' < 'b'    #output: True    因为第一个 a<b  所以后面不比较了  直接返回True
[1,2,[5,6]] < [2,1,[3,4]]   #output: True     因为第一个 1 < 2  后面不比较了 直接返回True   即使后面  [3,4] < [5,6]



# bool 运算 : or  and   not
not True    #非运算     字面意思理解  (不在  不是 ) 的意思


# 断言  assert     当出现 假 没有处理时  激活断言模块 执行  告诉程序员 哪个地方有bug
#  age = -1
#  assert 0 < age and age < 100,"dc"


# 迭代字典  就像迭代  列表一样   用  成员资格运算符  字典也支持序列解包
d = {
    'd':1,
    'c':2,
    'f':3
}
for key,value in d.items():    #items() 返回一个一个的项  返回的项是无顺序的
    print(key,':',value)
    
# enumerate(str)  这是一个内置函数  这个函数让在使用 成员资格 时   也可以拥有下标索引  而且下标索引是自动提供的
for index , value1 in enumerate('abcdefg'):   #默认第一个为下标索引  自动递增  第二个为取值
    print(index,value1,'\n')

    
# 并行迭代工具 zip 函数
he = ['h','x','m']
xi = [1,2,3]
zip(he,xi)     #是一个迭代器  可以转换为列表 和 元组
list(zip(he,xi))


# sorted 返回一个列表       reversed 返回一个迭代器  可以转换为元组和列表   而且也可以使用join  如下
''.join(reversed('asdfg'))


# 简单推导 
[(x,y) for x in range(3) for y in range(4) if x == y]     # 这个为列表推导     注意没有元组推导  最外层使用圆括号(元组)   得到的是 生成器  不是元组                             
print({i:'{} is {} day(s)'.format('today',i) for i in range(7)})


# 赋值再重现 之  1、' ={} '   2、 '= None'   3、 'del a'    这三种方法  在执行后  都是将一者的'指针'指向改变了  而不会影响其他值    如下
test1 = 'sadasd'
test2 = test1
print(test1,test2)

test1 = None    #不影响test2   因为只将test1的'指针指向改变了'  然而 字符串'sadasd'还存在存储空间中  而且test2还指向它  所以test2还是'sadasd'
print(test1,test2)

test1 = {}    #道理同上   test1 = {}   test2 = 'sadasd'
print(test1,test2)

del test1    #道理同上   test1 连名字都删除了  更不可能有指向的说法了   test2 = 'sadasd'    del是将名字和指向全部删掉   但是不会改变'sadasd'本身的存储  也不影响test2
#print(test1,test2)

#python有垃圾自动清理功能  当没有使用的就会被删除


# exec 和 eval 
# eval()函数和exec()函数的区别:
# 1、eval()函数只能计算单个表达式的值,而exec()函数可以动态运行代码段
# 2、eval()函数可以有返回值,而exec()函数返回值永远为None(无法进行赋值获取)

#  eval(source, globals=None, locals=None, /)
#  exec(source, globals=None, locals=None, /)
#  都是三个参数  第一个参数为必选项    第二个参数为全局变量   第三个参数为局部变量    
#  1、若 全局、局部都没有  直接调用全局变量   
#  2、若 全局有  局部没有   调用globals中定义的
#  3、若 全局有  局部有    相同的取局部的  其他的也以局部为主
#  4、若 全局没有  局部有   以局部为主         以局部为主

#例子
x = 10
def func():
    y = 20   #局部变量y
    a = eval("x+y")
    print("a:",a)      #x没有就调用全局变量
    b = eval("x+y",{"x":1,"y":2})     #定义局部变量,优先调用
    print("b:",b)
    c = eval("x+y",{"x":1,"y":2},{"y":3,"z":4})  
    print("c:",c)  
    d = eval("print(x,y)")
    print("d:",d)   #对于变量d,因为print()函数不是一个计算表达式,因此没有返回值
func()


x = 10
expr = """
z = 30
sum = x + y + z   #一大包代码
print(sum)
"""
def func():
    y = 20
    exec(expr)   #10+20+30
    exec(expr,{'x':1,'y':2})    #30+1+2
    exec(expr,{'x':1,'y':2},{'y':3,'z':4}) #30+1+3,x是定义全局变量1,y是局部变量  注意z=30
func()
# 主要以expr中的变量值为主   再以局部locals为主   再以globals为选择   最后都没定义就找全局变量 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值