• python-基础学习篇(一)


    python基础学习(一)

    不积硅步,无以至千里。基础的学习越加透彻,才能更清楚的理解和分析需求,我贯彻基础学习“永无止境”的理念,故把自学的知识梳理在博客中,基础学习篇无限更新。

    python介绍

    python是一种动态解释型的强类型定义语言。

      动态:python变量类型不在声明时指定,而是通过赋值的数据类型确定变量类型。有一种后指定的意思,举个例子:两个人A和B选择书情形,若先给A定义文科生,再“协定”他选择语文书,这种形式被称之为静态;若直接“给”B一本数学书,则认定B为理科生,这种形式被称为动态

      解释型:python代码单行执行。举个例子:一个不懂英文的人A想要找人B来帮他翻译一本纯英文文档的情形,B有两种选择:

    1.B一句一句翻译给A听,这种形式为解释型(一句一句解释给A听);

    2.B准备一下翻译完整个文档,再给A听,这种形式称为编译型

      OK,随之而来的优缺点,显而易见。解释型:B一句一句翻译,开发效率高,A听完整份英文文档,运行效率低;编译型:B通篇翻译完,开发效率低;A通篇一次听完,运行效率高。提个问题:A在两种方式听文档的过程中,发现结果不符合自己的推测,中间某个部分出现问题(bug),对B来说,有何感想?

    语言学习方法

      编程语言也是一种语言,就如同我们学习的汉语、英语,没有什么神奇的地方。先学习字,再到组词,造句,作文,中间穿插部分语法规则,可以理解文章都是积累而成,同样,编程也是一种积累的过程,好词好句摘,好文背,需要透彻理解语法,理解他人好文的精髓之处,学以致用。又有不同之处,编程好文都是逻辑性很强的,抛却感性的天马行空,一切按清晰流程来表现出来的,所以学习过程中,学习画流程图和思维导图是非常有必要的,这势必会帮助理清思路,就如同好文形成之前的提纲。

      基础数据类型

    • 整型(int)

    整型就是整数类型,例如:1,2,3,4,...

    注:我们默认使用的整数都是十进制数,这点要清楚。python中二进制表示:0b,八进制表示:0o,十六进制表示:0x,分别使用bin(),oct(),hex()转化十进制成为各种进制数。

    1 >>> bin(10)
    2 '0b1010'
    3 >>> oct(10)
    4 '0o12'
    5 >>> hex(10)
    6 '0xa'
    View Code
    • 浮点型(float)

    浮点型是指浮点数类型,例如:1.0,1.1,1.21,...

    注:浮点型和整型通过运算以后的结果为浮点型。另外需要了解IEEE 754浮点数算术标准,对小数精度要求高,需要使用decimal模块。

     1 integer_number = 1
     2 float_number = 2.0
     3 integer_number = 1
     4 float_number = 2.0
     5 addition = integer_number + float_number
     6 addition
     7 >>>3.0
     8 d_value = float_number - integer_number
     9 d_value
    10 >>>1.0
    11 product = float_number * integer_number
    12 product
    13 >>>2.0
    14 quotient_value = float_number / integer_number
    15 quotient_value
    16 >>>2.0
    View Code
    • 布尔型(bool)

    布尔型就是布尔值,布尔值只有两个True和False。

    注:布尔值存在逻辑真值的说法,表示方法是True和False,1和0可表示其逻辑真值,即1代表True,0代表False。同理,任何非0或者非空的数据类型都可表示True,反之,表示False。另外需要注意,这里逻辑真值是无法等同的,只是逻辑上表示同样的真假。False的逻辑真值有:None、0、0.0、Fasle、0j、‘’、[]、()、set()、{}。

     1 >>> [] ==False
     2 False
     3 >>> set() == False #空集合的表示
     4 False
     5 >>> {} == False
     6 False
     7 >>> () == False
     8 False
     9 >>> '' == False
    10 False
    11 >>> 2 == True
    12 False
    13 >>> (1,) == True #单个元素的元组表示
    14 False
    15 >>> 1 == True   # 注意
    16 True
    17 >>> 0 == False  #注意
    18 True
    View Code
    • 复数型(complex)

    复数型是指复数,复数 = 实部 + 虚部,例如: 1+1.5j,1.5j是虚数表示形式,为虚部。

    注:工程学中,虚数使用j作为表示,而基础数学中,使用i作为表示,注意区分。

      运算符

      运算符是通过特定的符号进行通用协议上的运算,优先级是运算自左向右进行,哪一部分要优先运算的规定,通常而言,算术运算符>关系运算发>逻辑运算符

    • 算术运算符

    算术运算符就是我们数学中平常的加减乘除一类,下面详细了解一下python中基本算术运算符:+、-、*、/、%、**、//。

    注:/ 中0不能作为除数,这个是不可忘记的;

           % 表示取余 例如:5%3 商为1,余数为2;

           ** 表示幂次方,例如:3的平方:3**2,4的三次方:4**3;

           // 表示整除,可以认为地板除,向下取整,例如:5/3 结果为1.6666...,而5//3 结果为1,表现更像是取商,如同%运算。

    1 >>> 5 % 3
    2 2
    3 >>> 3 ** 2
    4 9
    5 >>> 4 ** 3
    6 64
    7 >>> 5 // 3
    8 1
    View Code

      运算优先级:*、/、%、**、// 同级,+、-同级。

    • 关系运算符

      关系运算符:==、!=、>=、<=、>、<,关系运算符其实就是比较大小的问题,例如:A和B比较:A == B、 A !=B、A >=B、A <=B、A<B、A>B返回结果为bool值True或者False。

      运算优先级:关系运算符都处于同级。

    • 逻辑运算符

      逻辑运算符有:not、and、or,运算结果返回bool值True或者False,当然如果操作数都不是bool值,逻辑真值就突出表现出来了。

     1 >>> not True
     2 False
     3 >>> not 2
     4 False
     5 >>> not False
     6 True
     7 >>> not None
     8 True
     9 >>> 1 and 0  # and运算:同真为真,一假即假。
    10 0
    11 >>> 2 or 0  # or运算:同假为假,一真即真
    12 2
    13 >>> 1 and 2 #1为真,and同真才为真,程序需要看到后面操作数再返回
    14 2
    15 >>> 1 or 2 #1为真,or一真为真,程序走到第一个操作数为真,直接返回
    16 1
    17 >>> 2 and True #逻辑真值和bool值,返回什么由逻辑决定
    18 True
    19 >>> 2 or False
    20 2
    21 >>> False or 2
    22 2
    View Code
      运算优先级:not > and > or,其意思从左向右运算,先not,再and,最后or运算。

       序列数据类型

    • 字符串类型(String)

      字符串说简单点就是一串字符使用 ‘ ’(单引号)或者“ ”(双引号)括起来,考虑太多没意义,就是‘ ’(单引号)括起来的一串字符。

    1 >>> "Just'in" #当字符串中出现‘’(单引号)或者“”(双引号)时,交替使用
    2 "Just'in"
    3 >>> 'Just"in'
    4 'Just"in'
    View Code

      要了解字符串,先了解一下字符什么意思。提出一个概念:字符和字节。计算机嘛,只认识0和1两种状态,为什么这么说?我的理解是对于一个机器而言,只有断电和上电,稍显高级一点能够区分高电平和低电平,使用0和1表示两种状态,一般而言,0表示断电和低电平,1表示上电和高电平。如此复杂的生活和生产情景,仅仅使用两种状态表示计算机也就无法迈进我们的生活了,举个例子:使用计算机让A和B比大小,0表示小,1表示大,如果A和B相等怎么办?这个时候引入的编码思想,简直是计算机领域的马克思主义思想,注意,我这里提到的是编码思想,一段理论上升到思想的高度,其重要性不言而喻。

      举个例子感受一下编码思想:说一个国王在酒宴上发现100桶酒中有1桶酒被坏人下了毒药,国王很生气,下令让看守酒的侍卫试酒,找出哪一桶是毒酒,一个侍卫可以试多桶酒,多个侍卫也可以试一桶酒,问怎样可以让尽量少的侍卫最少时间内参与试酒找出毒酒?

      一维思维:100桶酒,一人一桶试酒。  结果:100人

      二维思维:100桶酒摆成10*10的方阵。  结果:20人

      三维思维:100桶酒摆成5*5*4的立方体。  结果:14人

      能想到三维解决问题,已经不简单了吧。

      编码思维:100桶酒,每个人按照转身和不转身表示1和0,给100桶酒编号1-100,2**7 = 128,0000001表示试到1号桶,01100100表示试到100号桶。 结果:7人

      上面的编码思维在没有认识编码以前可能不太理解,解释一下:对0和1不限位次组合可以表示N种状态:1位_ 可以是0或者1表示两种状态,2位_ _ 可以是00、01、10、11四种状态,3位_ _ _ 可以是八种状态,n位就可以表示2**n种状态了。注意,我提到的一直是状态,这个状态可以是数字,文字,符号,只要协商一致(协议),相互就可以理解了。举个例子:我们协商3位表示一个字符,000表示P,001表示Y,010表示T,011表示H,100表示O,101表示N,那000001010011100可以轻易解释为:PYTHON,符号相同。当然这只是我们的协商,算不得通用。数字表示:000表示0,001表示1,010表示2,011表示3,100表示4,100100表示0*2**0+0*2**1+1*2**2+0*2**3+0*2**4+1*2**5=36(其实就是位由右至左1,2,4,8,16,32,64,...,乘以0或者1再求和的问题),这种数字表示方法不是我们协商而定的,是通用的表示方法,我们称为二进制表示,至于八进制表示就是位由右至左1,8,64,...,而像二进制每个比特位是0或者1,不超过2,由0和1两种,八进制是0-7表示不超过8,十六进制类推。OK,那么1位,2位,这个位就是所谓的比特位。继续延申,我们知道英文的基础就是26个字母,算上大小写为52个,还有一些特殊符号:+、-、*、/等等一共127个,2**7=128,使用7个比特位就可以表示,但是考虑后续补充,预留1位,这就是ASCII编码。ASCII编码一共使用8个比特位,最左边一位始终为预留位,表示为0。计算机的发明者是英语为母语的人,他认为预留1位,2**8 = 512,去除英语使用的127个,剩余的完全够其他语言使用或者其他状态表示,然而,亚洲语种的出现,例如汉语,512个都完全不够,汉字的数量90000多,我们就需要增加比特位数进行编码,比特位的增多势必影响表示方法的复杂,为了简便表示我们按照最早的ASCII编码8个比特位(bit)记为1个字节(byte),就如同克(g)和千克(kg),表示大质量的物体,我们可以使用kg表示,这样一来,ASCII码使用8bit表示1个字符,即1个字节表示1个字符。那么增加多少位呢?Unicode编码出现了,Unicode编码认为统一万国文字,全部使用4个字节(32bit)表示字符,一个汉字4个字节,一个英文字母也是4个字节,但是考虑一下,2**32是42亿,完全超了,这种表示造成了极大的资源浪费(硬件存储:按位存储和按字节存储,即耗费硬件资源)。演变至今,UTF-8编码出现,UTF-8编码规定一个英文字符使用1个字节表示,一个汉字使用3个字节表示(2**24=16777216),UTF-8这种区分英文和汉字的形式被称为可变长编码。

    1 >>> empty_str = ''  # 空字串的表示方法
    2 >>> empty_str
    3 ''
    4 >>> one_str = '1'  # 单字符的字符串的表示方法
    5 >>> one_str
    6 '1'
    7 >>> test_str = '[1,2,3,4]'  # 基本数据类型和序列数据类型都可以作为字符,自己尝试
    8 >>> test_str
    9 '[1,2,3,4]'
    View Code

      上文核心梳理:比特位、字节、字符、数字表示(二进制、八进制、十进制、十六进制)、文字和符号表示(ASCII编码、Unicode编码、UTF-8编码)

        比特位:01010101010,每一个0或者1表示1个比特位

        字节:01010101,8个比特位表示1个字节(8bit = 1Byte,1KB = 1024 Bytes,1MB = 1024KB,1GB = 1024MB,1TB = 1024GB,1PB = 1024TB)

    注:bit,Byte,KB,MB,GB,TB,PB就如同g,kg,ton之间的单位换算。

         字符:每一个数字、符号、字母、汉字等文字代表一个字符。

        数字表示

        十进制:1,2,3,15,48,...,我们平时使用的数字表示就是十进制表示

        二进制:0b011100010,0b(零b)为二进制标志,使用0或者1占据每个比特位,不能超过2。换算为十进制的方法:比特位由右至左分别为1,2,4,8,16,...,(2的n-1次幂,n为右至左第n位),乘以各比特位上的实际数值,最后加和。例如:0b101 :1*2**(1-1)+0*2**(2-1)+1*2**(3-1) = 1*1+0*2+1*4 = 5。

        八进制:0o0123456701,0o(零o)为八进制标志,使用0-7之间的数占据每个比特位,不能超过8。换算为十进制的方法:比特位由右至左分别为1,8,64,512,...,(8的n-1次幂,n为右至左第n位),乘以各比特位上的实际数值,最后加和。例如:0o201 :1*8**(1-1)+0*8**(2-1)+2*8**(3-1) = 1*1+0*8+2*64= 129。

        十六进制:0x0158ADF01,0o(零x)为十六进制标志,使用0-9之间的数和A(10)、B(11)、C(12)、D(13)、E(14)、F(15)占据每个比特位,不能超过16。换算为十进制的方法:比特位由右至左分别为1,16,256,...,(8的n-1次幂,n为右至左第n位),乘以各比特位上的实际数值,最后加和。例如:0oB01 :1*16**(1-1)+0*16**(2-1)+11*16**(3-1) = 1*1+0*16+11*256= 2817。

        文字和符号表示(英文:一个英文字母,中文:一个汉字)

        ASCII编码:英文(8bit----------1个字节)、中文(无表示,毫无根据的认为ASCII编码因中文退出使用)

        Unicode编码:英文(32bit----------4个字节)、中文(32bit----------4个字节)

        UTF-8编码:英文(8bit----------1个字节)、中文(24bit----------3个字节)

        GBK编码:英文(8bit----------1个字节)、中文(16bit----------2个字节)   国人自己的编码方式

     1 >>> text = '' #python中字符串默认编码为Unicode
     2 >>> text.encode('UTF-8')
     3 b'xe5x93x88'
     4 >>> text.encode('GBK')
     5 b'xb9xfe'
     6 >>> text = 'a'
     7 >>> text.encode('UTF-8')
     8 b'a'
     9 >>> text.encode('GBK')
    10 b'a'    
    View Code
        注:还有一种大字符串格式,使用‘’‘ ’‘’(三引号)包围的,这种字符串属于预定义格式,一般字符串是占据一个物理行的,要换行需要在换行处使用(反斜杠),而大字符串是不需要使用换行的,可以在字符串内部随意换行,也叫多行字符串。更多的,大字符串是被用于多行注释,可以理解为代码是不被执行的,只用作自己备注,或者让他人能了解你代码的功能,说到这,单行注释使用#来标注,同样也是不被执行的。
    1     def casefold(self, *args, **kwargs): # real signature unknown
    2         """ Return a version of the string suitable for caseless comparisons. """
    3         pass
    4     ’‘’代码取自builtins.py中str类中的casefold方法,简单说就是源码,有单行注释和功能介绍的大字符串注释‘’‘
    View Code
    • 列表类型(List)

     列表是由多个元素组成,多个元素使用 [ ](方括号)包围,由,(逗号)分隔。其中组成列表的元素多种多样,可以这么说,python中存在的数据类型都可以作为列表的元素,有基本数据类型:int、float、bool、complex,可以是序列数据类型:str、list、tuple、set、dict。

     1 >> empty_list = []  # 空列表的表示方法
     2 >>> empty_list
     3 []
     4 >>> one_list = [1]  # 单元素列表的表示方法
     5 >>> one_list
     6 [1]
     7 >>> type(one_list)  #type()内置函数判断数据类型
     8 <class 'list'>
     9 >>> full_list = [1, 1.2, True, 1+2j, 'python', [1,2], (1,2), {1,2},{'k1':1, 'k2':2}]  #表示列表元素的所有数据类型
    10 >>> full_list
    11 [1, 1.2, True, (1+2j), 'python', [1, 2], (1, 2), {1, 2}, {'k1': 1, 'k2': 2}]
    View Code
    :列表中的元素是可以重复。
    • 元组类型(Tuple)

      列表表示形式像列表,注意我说的是表示形式,元组和列表区别还是有的,不然咱龟叔(python创始人)也没必要搞两个数据类型了。元组只是在列表的基础上,把[ ](方括号)换作了()(圆括号),其他一概不变,元素依旧用逗号隔开,所有类型都可以作为元素,仅此而已。

     1 >>> empty_tuple = ()  # 空元组的表示方法
     2 >>> empty_tuple
     3 ()
     4 >>> one_tuple = (1,)  #单元素的表示方法
     5 >>> one_tuple
     6 (1,)
     7 >>> type(one_tuple)
     8 <class 'tuple'>
     9 >>> singe_int = (1)  # 省略元素后面的逗号,就会表现成一个整数
    10 >>> type(singe_int)
    11 <class 'int'>
    12 >>> full_tuple = (1, 1.2, False, 1+2j, [1,2],(1,2),{1,2},{'k1':1,'k2':2})
    13 >>> full_tuple
    14 (1, 1.2, False, (1+2j), [1, 2], (1, 2), {1, 2}, {'k1': 1, 'k2': 2})
    15 >>> simple_tuple = 1,'1',[1,]  # 元组省略圆括号的表示形式,记住没有括号的一串元素就是元组!
    16 >>> type(simple_tuple)
    17 <class 'tuple'>
    View Code

    注:我在上例解释无括号元组表示中用到了[1,]表示单元素列表,讲解列表时也提出[1]可以表示单元素列表,这两者都是对的,集合、字典都可以这么表示,唯独元组必须加上逗号,所以统一一下,序列数据类型需要逗号分隔的单元素序列,我们一律加上逗号表示。

    • 集合类型(Set)

      集合的表示形式又像列表和元组的表示形式,只不过这次把包围的括号换作了{ }(花括号),看到这不禁感叹一门编程语言把符号应用的淋漓尽致,一共三括号,全用了就表示了三种数据类型。另外,不得不提一点,集合的元素是不重复的,重复的元素最终会合成一个元素表示。我还没理解的是,把是把后面重复的删除了,还是后面重复的覆盖了前面的。

    此外,非常重要的一点:集合的元素必须是不可变的数据类型。什么是不可变的数据类型,相对于可变类型来说,基本就是无法通过赋值改变其内元素值的类型,记住python中可变数据类型只有3个:list、set、dict,其余都是不可变数据类型。延申说一点,不可变数据类型是可以哈希运算(一种系列算法)的,是hashable数据类型,那么,可变数据类型就是hashable的。

     1 >>> empty_set = set()  # 空集合的表示方法
     2 >>> empty_set
     3 set()
     4 >>> type(empty_set)
     5 <class 'set'>
     6 >>> empty_dict = {}  # 空字典的表示方法,注意!!!
     7 >>> empty_dict
     8 {}
     9 >>> type(empty_dict)
    10 <class 'dict'>
    11 >>> empty_set = {1,}   # 单元素集合的表示,下同,不做说明了
    12 >>> one_set = {1,}
    13 >>> one_set
    14 {1}
    15 >>> single_set = {1}
    16 >>> single_set
    17 {1}
    18 >>> full_set = {1, 1.2, False, 1+2j, 'python', [1,2]}  # 列表是可变数据类型,是unhashable的,不可作为集合元素
    19 Traceback (most recent call last):
    20   File "<pyshell#37>", line 1, in <module>
    21     full_set = {1, 1.2, False, 1+2j, 'python', [1,2], (1,2), {1,2},{'k1':1, 'k2':2}}
    22 TypeError: unhashable type: 'list'
    23 >>> test_set = {{'k1':1,}}  # 字典是可变数据类型,是unhashable的,不可作为集合元素
    24 Traceback (most recent call last):
    25   File "<pyshell#38>", line 1, in <module>
    26     test_set = {{'k1':1,}}
    27 TypeError: unhashable type: 'dict'
    28 >>> full_set = {1, 1.2, False, 1+2j, 'python', {1,2}}  # 集合是可变数据类型,是unhashable的,不可作为集合元素
    29 Traceback (most recent call last):
    30   File "<pyshell#39>", line 1, in <module>
    31     full_set = {1, 1.2, False, 1+2j, 'python', {1,2}}
    32 TypeError: unhashable type: 'set'
    33 >>> full_set = {1, 1.2, False, 1+2j, 'python',(1,2,3)}  # 输出改变了输入集合的元素顺序,集合是无序的
    34 >>> full_set
    35 {False, 1, 1.2, (1+2j), (1, 2, 3), 'python'}
    View Code
    • 字典类型(Dictionary)

      字典从表示形式来看是在集合基础上做出的新突破,字典通过键和值的对应来表示,依旧像集合使用花括号来包围,只是在元素上出现key:value(键:值)的形式。通俗来看,就是用两个元素结合:(冒号)表示成一个字典元素。那么既然说了是两个元素结合一个元素,两个结合的元素分别称为:key(键)和Value(值)。键和值又使用什么数据类型表示:字典中的键要求是不可变数据类型,就如同集合元素一般,而值的类型像列表一样,所有数据类型都可以表示。

     1 >>> empty_dict = {}  # 空字典的表示方法
     2 >>> empty_dict
     3 {}
     4 >>> type(empty_dict)
     5 <class 'dict'>
     6 >>> single_dict = {'k':1,}  #单元素字典的表示方法
     7 >>> single_dict
     8 {'k': 1}
     9 >>> len(single_dict)   #len()内置函数表示数据类型的长度
    10 1
    11 >>> test_dict = {[1,2]:1}  # 列表是可变数据类型,是unhashable的,不能作为字典的键
    12 Traceback (most recent call last):
    13   File "<pyshell#55>", line 1, in <module>
    14     test_dict = {[1,2]:1}
    15 TypeError: unhashable type: 'list'
    16 >>> test_dict = {{1,2}:1}  # 集合是可变数据类型,是unhashable的,不能作为字典的键
    17 Traceback (most recent call last):
    18   File "<pyshell#56>", line 1, in <module>
    19     test_dict = {{1,2}:1}
    20 TypeError: unhashable type: 'set'
    21 >>> test_dict = {{'k':1}:2}  # 字典是可变数据类型,是unhashable的,不能作为字典的键
    22 Traceback (most recent call last):
    23   File "<pyshell#57>", line 1, in <module>
    24     test_dict = {{'k':1}:2}
    25 TypeError: unhashable type: 'dict'
    View Code

      操作方法

      基本数据类型可以通过运算符进行操作,而序列数据类型通常是一组元素组成的序列,这样的数据类型又会有各自的独特的操作方法,熟悉操作方法才能对数据进行更加准确和有效的分析。

    另见 python基础学习篇(二)(三)(四)(五)(六)

    备注:序列数据类型操作方法繁多,根据序列数据类型:string,list,tuple;set,dict分为5篇整理。

  • 相关阅读:
    UVa 541 Error Correction
    UVa 11045 My T-shirt suits me
    【模板】Ford-Fulkerson算法
    POJ 1273 Drainage Ditches
    UVa 10158 War
    UVa 658 It's not a Bug, it's a Feature!
    【模板】并查集
    【模板】Floyd-Warshall算法
    UVa 10034 Freckles
    UVa 10048 Audiophobia
  • 原文地址:https://www.cnblogs.com/snow-lanuage/p/10217341.html
Copyright © 2020-2023  润新知