Python


循环

  • while循环

    count = 1
    while count < 8:
        print("....")
    
    while True:
        s = input("start:")
        if s == "t":
            break #结束本次循环
        if 'a' in s:
            print("输入内容不符合规则")
            continue    #结束当前循环,继续执行下一次循环
        print("ss:"+s)
    
    #1+2+3+4...+100?
    count = 1
    sum = 0
    while count <= 100:
        sum += count
        count +=1
    print(sum)
    
    #输出1-100中的奇数
    count = 1
    while count <=100:
        if count % 2 !=0:
            print(count)
        count += 1
  • 格式化输出

    name = input("输入名字:")
    age = input("年龄:")
    gender = input("xingbie:")
    print("%s今年%s,爱好,性bie%s"%(name,age,gender))
    #%s表示占位符(任何类型) %d :数字    %%2=%2 表示转义(%默认占位)

    %s就是代表字符串占位符,除此之外,还有%d, 是数字占位符, 如果把上⾯的age后⾯的换成%d,就代表你必须只 能输⼊数字啦 这时对应的数据必须是int类型. 否则程序会报错 使⽤时,需要进⾏类型转换.

  • 基本运算符

    ​ 1.算数运算符

    ​ 2.比较运算符 != 和 <> 表示不等于

    ​ 3.逻辑运算符 and :并且的意思(两边都为真,结果为真) or:或者的的意思(两边有一个为真,则为真,全部是假,结果才能是假) not 非的意思(相反)

    ​ #and or not 同时存在时,先算括号,然后not,然后and,最后or

    print(3>4 or 4<3 and 1==1)    False
    print(1 < 2 and 3 < 4 or 1>2) True
    print(2 > 1 and 3 < 4 or 4 > 5 and 2 < 1) True
    print(1 > 2 and 3 < 4 or 4 > 5 and 2 > 1 or 9 < 8)    False
    print(1 > 1 and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6) False
    print(not 2 > 1 and 3 < 4 or 4 > 5 and 2 > 1 and 9 > 8 or 7 < 6) False
    
    print(1 or 2) 1
    print(0 or 3) 3         # x or y 如果x==0,那么就是y,否则是x
    print(0 and 2)    0        #and 相反 x and 如果x==0 那么就是x,否则就是y
    print(1 and 2)     2

    ​ 4.赋值运算符

    ​ 5.成员运算符

    ​ 6.身份运算符

    ​ 7.位运算符

一.python基本数据类型

​ 1. int ==> 整数. 主要用来进行数学运算

​ 2. str ==> 字符串, 可以保存少量数据并进行相应的操作

​ 3. bool==>判断真假, True, False

​ 4. list==> 存储大量数据.⽤用[ ]表示

​ 5. tuple=> 元组, 不可以发⽣生改变 用( )表示

​ 6. dict==> 字典, 保存键值对, 一样可以保存⼤大量量数据

​ 7.set==> 集合, 保存大量数据. 不可以重复. 其实就是不保存value的dict

二. 整数(int) 在python3中所有的整数都是int类型. 但在python2中如果数据量比较⼤大. 会使用long类型. 在python3中不存在long类型

整数可以进行的操作:

bit_length(). 计算整数在内存中占⽤用的二进制码的长度

三. 布尔值(bool)

取值只有True, False. bool值没有操作

. 转换问题: str => int int(str) int => str str(int) int => bool bool(int).

0是False 非0是True

​ bool=>int int(bool) True是1, False是0 str => bool bool(str)

​ *字符串是False, 不空是True bool => str str(bool) 把bool值转换成相应的”值”**

四. 字符串(str)

​ 把字符连成串. 在python中用’, “, ‘’’, “””引起来的内容被称为字符串.

五.编码

  • 最早的计算机编码是ASCLL

    1.GBK 每个字符占2个字节,16位

    2.unicode 万国码 usc-2 16位 2个字节 ucs-4 32位 4个字节

    3.UTF-8 每个字符最少占8位,英文占一个1字节,中文占3个字节 ,可变编码长度

    4.UTF-16 每个字符最少占16位

    • 单位转换

      8bit=1byte

      1024byte=1KB

      1024KB=1MB

      1024MB=1GB

      1024GB=1TB

      1024TB=1PB

      1024PB=1EB

      1024EB=1ZB

      1024ZB=1YB

      1024YB=1NB

  • 基本数据类型(list,tuple)

    • 列表

      1.列表的介绍

      ​ 列表是python的基础数据类型之⼀ ,其他编程语⾔也有类似的数据类型. 比如JS中的数 组, java中的数组等等. 它是以[ ]括起来, 每个元素⽤’ , ‘隔开⽽且可以存放各种数据类型:

      lst = [1, '哈哈', "吼吼", [1,8,0,"百度"], ("我","叫", "元", "组"), "abc", {"我
      叫":"dict字典"},{"我叫集合","集合"}]

      列表相比于字符串. 不仅可以存放不同的数据类型. ⽽且可以存放⼤量的数据. 32位 python可以存放: 536870912个元素, 64位可以存放: 1152921504606846975个元素.⽽且列 表是有序的(按照你保存的顺序),有索引, 可以切⽚⽅便取值.

      2.列表的索引和切片

      ​ 列表和字符串一样也拥有索引:

      lst = ["麻花藤", "王剑林", "⻢芸", "周鸿医", "向华强"]
      print(lst[0]) # 获取第⼀个元素
      print(lst[1])
      print(lst[2])
      
      lst[3] = "流动强" # 注意. 列表是可以发⽣改变的. 这⾥和字符串不⼀样
      print(lst) # ['麻花藤', '王剑林', '⻢芸', '流动强', '向华强']
      s0 = "向华强"
      s0[1] = "美" # TypeError: 'str' object does not support item assignment 不
      允许改变
      print(s0)

      ​ 列表的切片

      lst = ["麻花藤", "王剑林", "⻢芸", "周鸿医", "向华强"]
      print(lst[0:3]) # ['麻花藤', '王剑林', '⻢芸']
      print(lst[:3]) # ['麻花藤', '王剑林', '⻢芸']
      print(lst[1::2]) # ['王剑林', '周鸿医'] 也有步⻓
      print(lst[2::-1]) # ['⻢芸', '王剑林', '麻花藤'] 也可以倒着取
      print(lst[-1:-3:-2]) # 倒着带步⻓

      2.列表的增删改查

      ​ 1.增,注意,list和str是不一样的。lst可以发生改变,所以就在原来的对象上进行了操作

      lst = ["麻花藤", "林俊杰", "周润发", "周芷若"]
      print(lst)
      lst.append("wusir")
      print(lst)
      
      lst = []
      while True:
           content = input("请输⼊你要录⼊的员⼯信息, 输⼊Q退出:")
           if content.upper() == 'Q':
               break
           lst.append(content)
      print(lst)
      
      lst = ["麻花藤", "张德忠", "孔德福"]
      lst.insert(1, "刘德华") # 在1的位置插⼊刘德华. 原来的元素向后移动⼀位
      print(lst)
      
      # 迭代添加
      lst = ["王志⽂", "张⼀⼭", "苦海⽆涯"]
      lst.extend(["麻花藤", "麻花不疼"]) 添加的列表
      print(lst)

      ​ 2.删除

      ​ pop,remove,clear,del

      lst = ["麻花藤", "王剑林", "李嘉诚", "王富贵"]
      print(lst)
      deleted = lst.pop() # 删除最后⼀个,有返回值
      print("被删除的", deleted)
      print(lst)
      
      el = lst.pop(2) # 删除2号元素
      print(el)
      print(lst)
      
      lst.remove("麻花藤") # 删除指定元素
      print(lst)
      
      # lst.remove("哈哈") # 删除不存在的元素会报错
      # # print(lst)
      lst.clear() # 清空list
      print(lst)
      
      # 切⽚删除
      del lst[1:3]
      print(lst)

      ​ 3.修改

      ​ 索引切片修改

      # 修改
      lst = ["太⽩", "太⿊", "五⾊", "银王", "⽇天"]
      lst[1] = "太污" # 把1号元素修改成太污
      print(lst)
      
      lst[1:4:3] = ["麻花藤", "哇靠"] # 切⽚修改也OK. 如果步⻓不是1, 要注意. 元素的个
      数
      print(lst)
      
      lst[1:4] = ["李嘉诚个⻳⼉⼦"] # 如果切⽚没有步⻓或者步⻓是1. 则不⽤关⼼个数
      print(lst)

      ​ 4.查询

      ​ 列表是一个可迭代对象,可以有for进行循环

      for el in lst:
       print(el)

      ​ 5.其他操作

      lst = ["太⽩", "太⿊", "五⾊", "银王", "⽇天", "太⽩"]
      c = lst.count("太⽩") # 查询太⽩出现的次数
      print(c)
      
      lst = [1, 11, 22, 2]
      lst.sort() # 排序. 默认升序
      print(lst)
      lst.sort(reverse=True) # 降序
      print(lst)
      
      lst = ["太⽩", "太⿊", "五⾊", "银王", "⽇天", "太⽩"]
      print(lst)
      lst.reverse() 没有返回值,显示None,对列表反向排序
      print(lst)
      
      l = len(lst) # 列表的⻓度
      print(l)

      ​ 6.列表的嵌套

      lst = [1, "太⽩", "wusir", ["⻢⻁疼", ["可⼝可乐"], "王剑林"]]
      # 找到wusir
      print(lst[2])
      
      # 找到太⽩和wusir
      print(lst[1:3])
      
      # 找到太⽩的⽩字
      print(lst[1][1])
      
      # 将wusir拿到. 然后⾸字⺟⼤写. 再扔回去
      s = lst[2]
      s = s.capitalize()
      lst[2] = s
      print(lst)
      
      # 简写
      lst[2] = lst[2].capitalize()
      print(lst)
      
      # 把太⽩换成太⿊
      lst[1] = lst[1].replace("⽩", "⿊")
      print(lst)
      
      # 把⻢⻁疼换成⻢化疼
      lst[3][0] = lst[3][0].replace("⻁", "化")
      print(lst[3][0])
      lst[3][1].append("雪碧")
      print(lst)
  • 元组和元组的嵌套

    • 元组:俗称不可变的列表,又被称为只读列表,元组也是python的基本数据类型之一,

      ​ 有小括号括起来,里面可以放任何数据类型的数据,查询也可以,循环也可以,

      ​ 切片也可以,但就是不能改

      tu = (1, "太⽩", "李⽩", "太⿊", "怎么⿊")
      print(tu)
      
      print(tu[0])
      print(tu[2])
      print(tu[2:5]) # 切⽚之后还是元组
      
      # for循环遍历元组
      for el in tu:
       print(el)
      
      # 尝试修改元组
      # tu[1] = "⻢⻁疼" # 报错 'tuple' object does not support item assignment
      
      tu = (1, "哈哈", [], "呵呵")
      # tu[2] = ["fdsaf"] # 这么改不⾏
      
      tu[2].append("麻花藤") # 可以改了. 没报错
      tu[2].append("王剑林")
      print(tu)
      • 关于不可变,注意:这里元组不可变的意思是:子元素不可变,而子元素内部的子元素是可变的,这取决于子元素是否是可变对象

      • 元组中如果只有一个元素,一定要添加一个逗号,否则就不是元组

        tu = (1,)
        print(type(tu))

        元组也有count(), index(), len()等⽅法

      1.range

      ​ range可以帮我获取一组数据,通过for循环能够获取到这些数据

      for num in range(10):
       print(num)
      
      for num in range(1, 10, 2):
       print(num)
      
      for num in range(10, 1, -2): # 反着来, 和切⽚⼀样
       print(num)
  • 基本数据类型(dict)

    • 字典(dict)是python中唯一的一个映射类型,是以{}括起来的键值对组成。在dict中key是唯一的,在保存的时候,根据key来计算出一个内存地址,然后将key-value保存在这个地址中。这种算法被称为hash算法,所以在dict中key必须是hash的。哈希所谓就是不可变的

    • 语法

      • {key1:value,key2:value}
        • 注意:key必须是可哈希的,value没有要求,可以保存任意类型的数据
      # 合法
      dic = {123: 456, True: 999, "id": 1, "name": 'sylar', "age": 18, "stu": ['帅
      哥', '美⼥'], (1, 2, 3): '麻花藤'}
      print(dic[123])
      print(dic[True])
      print(dic['id'])
      print(dic['stu'])
      print(dic[(1, 2, 3)])
      
      # 不合法
      # dic = {[1, 2, 3]: '周杰伦'} # list是可变的. 不能作为key
      # dic = {{1: 2}: "哈哈哈"} # dict是可变的. 不能作为key
      dic = {{1, 2, 3}: '呵呵呵'} # set是可变的, 不能作为key

      dict保存的数据不是按照我们添加进去的顺序保存的,是按照hash表的顺序保存的,而hash表不是连续的,所以不能进行切片工作,只能通过key来获取dict 中的数据

    • 字典的增删改查和其他相关操作

      • 增加
      dic = {}
      dic['name'] = '周润发' # 如果dict中没有出现这个key, 就会新增⼀个key-value的组
      合进dict
      dic['age'] = 18
      print(dic)
      
      # 如果dict中没有出现过这个key-value. 可以通过setdefault设置默认值
      dic.setdefault('李嘉诚') # 也可以往⾥⾯设置值.
      dic.setdefault("李嘉诚", "房地产") # 如果dict中已经存在了. 那么setdefault将不会
      起作⽤
      print(dic)
      
      • 删除
      ret = dic.pop("jay")
      print(ret)
      
      del dic["jay"]
      print(dic)
      
      # 随机删除.
      ret = dic.popitem()
      
      # 清空字典中的所
      dic.clear()
      • 修改
      dic = {"id": 123, "name": 'sylar', "age": 18}
      dic1 = {"id": 456, "name": "麻花藤", "ok": "wtf"}
      dic.update(dic1) # 把dic1中的内容更新到dic中. 如果key重名. 则修改替换. 如果不存
      在key, 则新增.
      print(dic)
      print(dic1)
      • 查询
      print(dic['name'])
      # print(dic['sylar']) # 报错
      print(dic.get("ok"))
      print(dic.get("sylar")) # None
      print(dic.get("sylar", "⽜B")) # ⽜B
      • 其他相关操作
      dic = {"id": 123, "name": 'sylar', "age": 18, "ok": "科⽐"}
      print(dic.keys()) # dict_keys(['id', 'name', 'age', 'ok']) 不⽤管它是什么.当
      成list来⽤就⾏
      for key in dic.keys():
       print(key)
      
      print(dic.values()) # dict_values([123, 'sylar', 18, '科⽐']) ⼀样. 也当
      list来⽤
      for value in dic.values():
       print(value)
      
      print(dic.items()) # dict_items([('id', 123), ('name', 'sylar'), ('age',
      18), ('ok', '科⽐')]) 这个东⻄也是list. 只不过list中装的是tuple
      for key, value in dic.items(): # ?? 这个是解构
       print(key, value)
          结果 123 456
          True 999
          id 1
          name sylar
          age 18
          stu ['帅哥', '美⼥']
          (1, 2, 3) 麻花藤
      
      
# 解构
a, b = 1, 2
print(a, b)
(c, d) = 3, 4
print(c, d)
e, f = [1, 2, 3] # 解构的时候注意数量必须匹配
print(e, f)
```

- 字典的嵌套

```
# 字典的嵌套
dic1 = {
 "name": "汪峰",
 "age": 18,
 "wife": {
 "name": '章⼦怡',
 "age": 28
 },
 "children": ['第⼀个⽑孩⼦', '第⼆个⽑孩⼦'],
 "desc": '峰哥不会告我吧. 没关系. 我想上头条的'
}

print(dic1.get("wife").get("name"))
print(dic1.get("children"))
print(dic1.get("children")[1])
```
  • 万恶之源-编码

    • is和==的区别

      • id()

      通过id()我们可以查看到一个变量表示的值内存中的地址

      s = 'alex'
      print(id(s)) # 4326667072
      s = "alex"
      print(id(s)) # 4326667072
      lst = [1, 2, 4]
      print(id(lst)) # 4326685768
      lst1 = [1, 2, 4]
      print(id(lst1)) # 4326684360
      
      s1 = "@1 2 "
      s2 = "@1 2 "
      print(id(s1))
      print(id(s2)) # 结果⼀致, 但是在终端中是不⼀致的. 所以在python中,命令⾏代码和py⽂
      件中的代码运⾏的效果可能是不⼀样的

      小数据池(常量池)把我们使用过的值存储在小数据池中,供其他的变量使用,小数据池给数字和字符串使用,其他数据类型不存在。

      对于数字:-5~256是会被加到效数据池中的,每次使用的都是同一个对象

      对于字符串:

      ​ 1.如果是纯文字信息和下划线,那么这个对象会被添加到小数据池

      ​ 2.如果是带有特殊字符的,那么不会添加到小数据池,每次都是新的

      ​ 3.如果是带有字母*n的情况,’a’*20,在20个单位内是可以 的. 超过20个单位就不会添加 到⼩数据池中

注意(⼀般情况下): 在py⽂件中. 如果你只是单纯的定义⼀个字符串. 那么⼀般情况下都是会 被添加到⼩数据池中的. 我们可以这样认为: 在使⽤字符串的时候, python会帮我们把字符串 进⾏缓存, 在下次使⽤的时候直接指向这个字符串即可. 可以节省很多内存. 





- 总结: is 比较的是地址 == 比较的是值 
  • 编码的补充

    • python2中默认使⽤的是ASCII码. 所以不⽀持中⽂. 如果需要在Python2中更改编码. 需要在⽂件的开始编写:
    # -*- encoding:utf-8 -*-
    • python3中: 内存中使⽤的是unicode码.
  1. ASCII : 最早的编码. ⾥⾯有英⽂⼤写字⺟, ⼩写字⺟, 数字, ⼀些特殊字符. 没有中⽂, 8个01代码, 8个bit, 1个byte

  2. GBK: 中⽂国标码, ⾥⾯包含了ASCII编码和中⽂常⽤编码. 16个bit, 2个byte

  3. UNICODE: 万国码, ⾥⾯包含了全世界所有国家⽂字的编码. 32个bit, 4个byte, 包含了 ASCII

  4. UTF-8: 可变⻓度的万国码. 是unicode的⼀种实现. 最⼩字符占8位

    1.英⽂: 8bit 1byte

    2.欧洲⽂字:16bit 2byte

    3.中⽂:24bit 3byte

  • 在python3的内存中. 在程序运⾏阶段. 使⽤的是unicode编码. 因为unicode是万国码. 什么内 容都可以进⾏显⽰. 那么在数据传输和存储的时候由于unicode比较浪费空间和资源. 需要把 unicode转存成UTF-8或者GBK进⾏存储. 怎么转换呢. 在python中可以把⽂字信息进⾏编码. 编码之后的内容就可以进⾏传输了. 编码之后的数据是bytes类型的数据.其实啊. 还是原来的 数据只是经过编码之后表现形式发⽣了改变⽽已.
  • bytes的表现形式:

        1.  英⽂ b'alex' 英⽂的表现形式和字符串没什么两样 
          2.   中⽂ b'\xe4\xb8\xad' 这是⼀个汉字的UTF-8的bytes表现形式 

    字符串在传输时转化成bytes=> encode(字符集)来完成

    s = "alex"
    print(s.encode("utf-8")) # 将字符串编码成UTF-8
    print(s.encode("GBK")) # 将字符串编码成GBK
    结果:
    b'alex'
    b'alex'
    
    s = "中"
    print(s.encode("UTF-8")) # 中⽂编码成UTF-8
    print(s.encode("GBK")) # 中⽂编码成GBK
    
    结果:
    b'\xe4\xb8\xad'
    b'\xd6\xd0'

    英⽂编码之后的结果和源字符串⼀致. 中⽂编码之后的结果根据编码的不同. 编码结果 也不同. 我们能看到. ⼀个中⽂的UTF-8编码是3个字节. ⼀个GBK的中⽂编码是2个字节. 编码之后的类型就是bytes类型. 在⽹络传输和存储的时候我们python是保存和存储的bytes 类型. 那么在对⽅接收的时候. 也是接收的bytes类型的数据. 我们可以使⽤decode()来进⾏解 码操作. 把bytes类型的数据还原回我们熟悉的字符串:

    s = "我叫李嘉诚"
    print(s.encode("utf-8")) #
    b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'
    
    print(b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'.decod
    e("utf-8")) # 解码
    • 编码和解码的时候都需要制定编码格式.
    s = "我是⽂字"
    bs = s.encode("GBK") # 我们这样可以获取到GBK的⽂字
    # 把GBK转换成UTF-8
    # ⾸先要把GBK转换成unicode. 也就是需要解码
    s = bs.decode("GBK") # 解码
    # 然后需要进⾏重新编码成UTF-8
    bss = s.encode("UTF-8") # 重新编码
    print(bss)

Author: 二哈君
Reprint policy: All articles in this blog are used except for special statements CC BY 4.0 reprint polocy. If reproduced, please indicate source 二哈君 !
 Previous
Python文件操作 Python文件操作
文件操作 1.初始文件操作 2.只读(r,rb) 3.只写(w,wb) 4.追加(a,ab) 5.r+读写 6.w+写读 7.a+写读(追加读写) 8.其他操作方法 9.文件的修改以及另一种打开文件句柄的方式 一.初始文件操作
2020-09-20 二哈君
Next 
Python Python
1. 计算机是什么 基本组成: 主板+cpu+内存 cpu: 主频, 核数(16) 内存:大小(8G, 16G, 32G) 型号:
2020-08-31 二哈君
  TOC