Python的一些基础知识点(一)

Python知识盲点(一)

一些基础

1.时间类

import time
b = time.time() # 返回从1970年1月1日0时开始到当前,总共经历的秒数
totalMinutes = b//60 #公共经历多少分钟
tatalHouses = totalMinutes // 60 #总共经历的多少小时

2.同一运算符

is 判断两个标识符是不是引用同一个对象
is not 判断两个标识符是不是引用不同的对象

is 与==的区别

  • is 用于判断两个变量引用对象是否为同一个,比较对象的地址(即:比较对象的id)
  • ==用于判断引用变量对象的值是否相等,默认调用对象的 eq()
  • is比==效率高,在变量和None进行比较的时候,应该使用is

Note:整数缓存问题

  • Python只对[-5,256]之间的整数对象进行缓存,超出这个范围就不缓存了(在IDLE当中是如此),但是不少解释器对这个都作出了优化,比如说Pycharm,对[-5, 正无穷]的整数都会进行缓存

    a = -6
    b = -6
    print(a is b) # False
    
    a = -5
    b = -5
    print(a is b) # True
    
    a = 100000000000001
    b = 100000000000001
    print(a is b) #
    

3.字符串编码

(1)编码转换

可以使用内置函数ord(),把字符转换成对应的Unicode码

使用内置函数chr()可以把十进制转换成对应的字符串

(2)字符串的一些操作

  • 字符串拼接

    a = "abc" + "cde" # abccde
    b = 'abc''cde' # abccde(abc,cde分别用单引号括上)
    
    
  • 字符串复制

    a = 'abc' * 3 # abcabcabc
    
  • 切片操作

    a = "abcdefghijklmnopqrstuvwxyz"
    b = a[-3:] #倒数三个,xyz
    c = a[-8,-3] #倒数第八~倒数第3,stuvw
    d = a[::-1] # a的逆序
    
    # note:
    #切片操作的时候,即使参数已经超过了范围,也不会报错,而是默认为空
    

(3)字符串驻留集

  • 字符串驻留:仅保存一份相同且不可变字符串的方法,不同的值被存放在字符串驻留池中。Python中,对于符合标识符规则的字符串,会启用字符串驻留集。

    扫描二维码关注公众号,回复: 13125964 查看本文章
    a = "abcd"
    b = "abcd"
    print(a is b) # True, 因为a和b都指向一个“abcd”
    
    c = "dd#"
    d = "dd#"
    print(c is d) # False, 因为“dd#”的写法并不符合字符规则
    
    str1 = "aa"
    str2 = "bb"
    print((str1 + str2) is "aabb") # False
    

(4)字符串去除收尾信息

a = "*a*b*c "
a.strip("*") # 去掉收尾的*, “a*b*c ”
a.lstrip("*")# 去掉a最左侧的*
a.strip()# 去掉首位空格,“*a*b*c”

(5)大小写转换

示例 说明
a.capitalize() 整个句子的首字母大写
a.title() 整个句子,每一个单词首字母大写
a.upper() 所有字母都转成大写
a.lower() 所有字母都转成小写
a.swapcase() 所有的字母大小写颠倒

(6)格式化字符串

format()的用法
a = "name:{0},age{1}"
a.format("Jack",18)
print(a) # name:Jack,age18

c = "name:{name},age{age}"
c.format(age = 19,name = "Jack")
print(c) # name:Jack,age:19
填充与对齐

^,<,> 分别代表:居中、左对齐、右对齐,后面带宽度

:后面带填充的字符,只能是一个字符,不指定的话,默认为空格

"{:*>8}".format("245") # *****245
数字格式化
格式 描述
{:.2f} 保留两位小数
{:+.2f} 带符号,保留两位小数
{:.0f} 不带小数
{:0>2d} 数字补零,填充左边,宽度是2
{:x<4d} 数字补x,填充右边,宽度是4
{:,} 以逗号分隔的数字形式
{.2%} 百分比格式,且往后保留两位小数
{:.2e} 指数记数法
{:10d} 右对齐,宽度是10
{:^10d} 中间对齐,宽度是10

4.可变字符串

字符串原本是不可变的,但是Python当中提供了一些让字符串“改变”的方法

import io
s = "hello,world"
t = io.StringIO(s) # 返回s所在的地址
t.getvalue() #返回地址t的value
t.seek(7) # 找到索引7的位置
t.write("g") # 将索引7修改为“g”
t.getValue() # hello,wgrld

5.运算符优先级

  • 先乘除后加减
  • 位运算符,算术运算符>比较运算符>赋值运算符>逻辑运算符

6.列表

(1)推导式创建列表

a = [x*2 for x in range(5)] # a = [0,2,4,6,8]
b = [x*2 for x in range(100) if x%9 == 0] # 用if过滤元素
print(b) # [0,18,36,54,72,90,108,126,144,162,180,198]

(2)列表元素添加和效率问题

  • +运算符

    a = [20,40]
    print(id(a)) # (1)
    a = a+[50,60]
    print(id(a)) # (2)
    
    #我们会发现(1)和(2)的地方值并不一样,即列表a的地址发生了变化。
    #即:在进行+操作后,会重新拷贝一个对象出来
    
  • extend()方法

    a = [20,40]
    print(id(a)) #(1)
    a.extend([50,60])
    print(id(a)) #(2)
    
    # (1)和(2)处的id值是相等的,说明没有发生“拷贝”
    
  • 综上两点,extend()要比+效率高

  • 除此之外,insert(), pop(),del()在使用时也会发生拷贝的现象,因此效率并不高,如果元素较多较大,不建议使用这些

(3)列表排序

  • 修改原列表,不建立新的列表

    a = [20,10,30,40]
    print(id(a)) # (1)
    a.sort() # 默认升序
    print(a) # [10,20,30,40]
    print(id(a)) #(2)
    a.sort(reverse = True) # 降序排列
    # (1),(2)的id值是一样的,说明没有发生新的拷贝
    
    import random
    random.shuffle(a) # 将a的顺序给打乱
    
  • 建立新的列表(sorted()方法)

a = [10,20,30,40]
b = sorted(a) #产生了一个新的对象
c = sorted(a,reverse = True) # 降序
  • reversed()返回迭代器

    reversed()不对原列表进行修改,只是返回一个逆序排列的迭代器对象

a = [20,10,30,40]
c = reversed(a)
print(c) #<list_reverseiterator object at 0x000000……>,即:c是一个迭代器对象
print(list(c)) # 第一次的时候,输出[40,30,10,20]
print(list(c)) #第二次的时候,由于迭代器指针已经遍历过列表了,于是指针继续下移,所以
				#输出一个[]
# 迭代器只能用一次

7.元组

tuple()可以接收列表、字符串、其他序列类型、迭代器等生成元组

list()可以接收元组、字符串、其他序列类型、迭代器等生成列表

b = tuple() # 创建一个空元组
b = tuple("abc") # ('a','b','c')
b = tuple([2,3,4]) # (2,3,4)

7.1元组排序

列表中有list.sorted()方法,但是元组中并没有,只能使用内置函数进行修改,即:sorted(tupleObj)

7.2 zip函数

zip(列表1,列表2,列表3,……):将多个列表对应的元素组合成元组,并返回zip对象

a = 1,20
b = 30,20
a+b # (1,20,30,20)
a = [10,20,30]
b = [40,50,60]
c = [70.80,90]
d = zip(a,b,c)
print(d) # <zip object at ……>
list(d) # [(10,40,70),(20,50,80),(30,60,90)]

8.字典的底层原理

本质上是一个散列表。散列表是一个稀疏数组(总是有空白元素的数组),数组的每一个单元叫bucket,每个bucket有两部分:一个是键对象的引用,一个是值对象的引用。

所以bucket的大小都是一致的,因此可以通过偏移量来读取bucket。

9.集合

值得一提的是,集合也是用{}来表示,和字典一样

集合的底层其实就是字典,只是,集合只有key值,而没有对应的value值

9.1相关操作

  • 集合没有重复的key值
  • 可以使用set()函数,将列表、元组等可迭代对象转成集合,若当中有重复数据,则只保留一个
  • 使用remove()函数删除指定元素,使用clear()清空整个集合

9.2相关运算

假设有a , b两个集合

a|b # 取并集
a&b # 取交集
a-b #差集
a.intersection(b) #交集
a.difference(b) #差集

猜你喜欢

转载自blog.csdn.net/johnny_love_1968/article/details/115425114