天池龙珠计划 Python训练营 (Task1)

本文主要用于记录不太熟悉的知识点

按位取反

按位取反
举例:用4位二进制表示 0100(4)(补码和源码一致)
按位取反 1011(补码)将其转化为源码 1010(补码等于反码加一) 1101(即-5)(符号位不变其他位置取反)
按位取反的小规律:~n = -(n+1) 正负数均适用
print(bin(4))  # 0b100
print(bin(5))  # 0b101
print(bin(~4), ~4)  # -0b101 -5

关于String类

  • 比较的两个变量,指向的都是地址不可变的类型(str等),那么is,is not 和 ==,!= 是完全等价的。(在python中String类型就是属于这一种)

  • 对比的两个变量,指向的是地址可变的类型(list,dict,tuple等),则两者是有区别的

      参考大佬的博客之后了解到:java为了提高效率,便于高效的管理这些String对象,设计了 ==String池(String pool)== 用于存放String对象,下面我们来分析一下两种创建String对象的机制。
    
      第一种方式:
      
      String string1 = “string”;,这种采用字面值创建String对象的方法,首先检查 String Pool 中是否存在“string”这个对象:
      
      1、如果存在,则不创建任何对象,直接将 String Pool 中的这个 string 对象的地址返回来,赋值给 string1 这个引用,这样 string1 就指向 String Pool 中的 “string” 这个对象;
      
      2、如果 String Pool 中不存在 “string”这个对象,那么就先在 String Pool 中创建一个 “string” 对象,然后将 String Pool 中这个 “string” 对象的地址返回来。
      
      第二种方式:
      
      String string2 = new String(“string”);,众所周知new出来的对象是创建在堆内存中的,但是这里因为有 String Pool 的概念,所以略有不同,首先还是检查 String Pool 中是否存在“string”这个对象:
      
      1、如果存在,则不在 String Pool 中再创建 “string”这个对象了,而是在堆内存(heap)中直接创建一个“string”对象,然后将堆中这个 “string”对象的地址返回来,赋值给 string2 引用,这时 string2 指向的是堆中的 “string”对象,注意并不是指向 String Pool;
      
      2、如果 String Pool 不存在 “string”这个对象,则首先在 String Pool 中创建一个“string”对象(为了方便管理嘛),然后再在堆中创建一个“string”对象,返回堆中这个“string”对象的地址,赋值给 string2 这个引用,这便使得 string2 指向了堆中的对应地址。
      
      总结:
      
      使用字面赋值方式创建 String 对象,返回的地址是指向 String Pool 中的,而使用new关键字创建的 String 对象,返回的地址是指向堆内存的。
    

使用dir方法来查看对象的属性和方法

  • Python 里面万物皆对象(object),整型也不例外,只要是对象,就有相应的属性 (attributes) 和方法(methods)。

  • Python 里面有很多用途广泛的包 (package),用什么你就引进 (import) 什么。包也是对象,也可以用上面提到的dir(decimal) 来看其属性和方法。

b = dir(int)
print(b)

# ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__',
# '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__',
# '__float__', '__floor__', '__floordiv__', '__format__', '__ge__',
# '__getattribute__', '__getnewargs__', '__gt__', '__hash__',
# '__index__', '__init__', '__init_subclass__', '__int__', '__invert__',
# '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__',
# '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__',
# '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__',
# '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__',
# '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__',
# '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__',
# '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__',
# 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag',
# 'numerator', 'real', 'to_bytes']

print() 函数

print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
  • 将对象以字符串表示的方式格式化输出到流文件对象file里。其中所有非关键字参数都按str()方式进行转换为字符串输出;
  • 关键字参数sep是实现分隔符,比如多个参数输出时想要输出中间的分隔字符;
  • 关键字参数end是输出结束时的字符,默认是换行符\n
  • 关键字参数file是定义流输出的文件,可以是标准的系统输出sys.stdout,也可以重定义为别的文件;
  • 关键字参数flush是立即把内容输出到流文件,不作缓存。
shoplist = ['apple', 'mango', 'carrot', 'banana']
print("This is printed with 'sep='&''.")
for item in shoplist:
    print(item, 'another string', sep='&')

for item in shoplist:
    print(item, 'another string', sep=' ')
    
"""
This is printed with 'sep='&''.
apple&another string
mango&another string
carrot&another string
banana&another string
apple another string
mango another string
carrot another string
banana another string
"""

Python之位运算实现整数集合

Python是一种对缩进十分敏感的语言

注意:

  • 不应该使用空格或Tab缩进的地方使用了空格或Tab。
  • 不同级别的代码没有缩进。
  • 缩进量不同。
  • Tab和空格的混用。

while - else 循环与for - else 循环

  • for循环正常执行完的情况下,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容,与while - else语句一样。

  • 当for循环正常执行完的情况下,执行else输出,如果for循环中执行了跳出循环的语句,比如 break,将不执行else代码块的内容,与while - else语句一样。

enumerate()函数

enumerate(sequence, [start=0])
  • sequence:一个序列、迭代器或其他支持迭代对象。
  • start:下标起始位置。
  • 返回 enumerate(枚举) 对象。
seasons = ['Spring', 'Summer', 'Fall', 'Winter']
lst = list(enumerate(seasons))
print(lst)
# [(0, 'Spring'), (1, 'Summer'), (2, 'Fall'), (3, 'Winter')]
lst = list(enumerate(seasons, start=1))  # 下标从 1 开始
print(lst)
# [(1, 'Spring'), (2, 'Summer'), (3, 'Fall'), (4, 'Winter')]

enumerate()与 for 循环的结合使用。

for i, a in enumerate(A)
    do something with a  

enumerate(A) 不仅返回了 A 中的元素,还顺便给该元素一个索引值 (默认从 0 开始)。此外,用 enumerate(A, j) 还可以确定索引起始值为 j

languages = ['Python', 'R', 'Matlab', 'C++']
for language in languages:
    print('I love', language)
print('Done!')
# I love Python
# I love R
# I love Matlab
# I love C++
# Done!


for i, language in enumerate(languages, 2):
    print(i, 'I love', language)
print('Done!')
# 2 I love Python
# 3 I love R
# 4 I love Matlab
# 5 I love C++
# Done!

Reference
关于String类型的部分思考和理解参考了博客https://blog.csdn.net/weixin_29791447/article/details/114171637
关于Python之位运算实现整数集合
https://blog.csdn.net/water19111213/article/details/107510844?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162645909016780357244637%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=162645909016780357244637&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allbaidu_landing_v2~default-3-107510844.first_rank_v2_pc_rank_v29&utm_term=%E5%88%A9%E7%94%A8%E4%BD%8D%E8%BF%90%E7%AE%97%E5%AE%9E%E7%8E%B0%E6%95%B4%E6%95%B0%E9%9B%86%E5%90%88&spm=1018.2226.3001.4187

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值