美文网首页Python基础
6.Python基础语法---02基础数据类型

6.Python基础语法---02基础数据类型

作者: 浪子大侠 | 来源:发表于2020-03-12 11:12 被阅读0次

    基础数据类型

    计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值。但是,计算机能处理的远不止数值,还可以处理文本、图形、音频、视频、网页等各种各样的数据,不同的数据,需要定义不同的数据类型。在Python中,能够直接处理的数据类型有以下几种:

    1.字符串

    字符串就是一系列字符。 在Python中, 用引号括起的都是字符串, 其中的引号包括单引号,双引号,三引号,用来表示字符串的话必须成队出现。

    单双引号可认为等价如下所示:

    "This is a string."
    'This is also a string.'
    

    如果'本身也是一个字符,那就可以用""括起来
    如果"本身也是字符,那就可以用''括号起来
    如下:

    'I told my friend, "Python is my favorite language!"'
    "The language 'Python' is named after Monty Python, not the snake."
    "One of Python's strengths is its diverse and supportive community."
    

    通过\也可以实现换行输入整行输出,显示时不会出现换行

    >>> print('line1\
    ... line2\
    ... line3')
    line1line2line3
    >>> print("line1\
    ... line2\
    ... line3")
    line1line2line3
    

    三引号:三个单引号,三个双引号效果是一样,实现换行输入,显示时换行会出现\n。

    >>> print('''line1
    ... line2
    ... line3''')
    line1
    line2
    line3
    

    如果写成程序并存为.py文件,就是:

    print('''line1
    line2
    line3''')
    
    1.1 转义字符

    特殊的字符:无法“看到”的字符;与语法本身语法有冲突的字符。上述两类字符需要使用转义字符
    常见:\n 换行;\r 回车;\'单引号;\t 横向制表符

    如果字符串内部既包含'又包含",可以用转义字符\来标识,比如:

    >>> 'I\'m \"OK\"!'
    'I\'m "OK"!'
    

    转义字符\可以转义很多字符,比如\n表示换行,\t表示制表符,字符\本身也需要要转义,所以\\表示的字符就是\

    >>> print('I\'m ok.')
    I'm ok.
    >>> print('I\'m learning\nPython.')
    I'm learning
    Python.
    >>> print('\\\n\\')
    \
    \
    
    1.2 原始字符

    如果字符串里面有很多字符都需要转义,就需要加很多\。为了简化,Python还允许用r''表示''内部的字符串默认不转义
    r后就不是一个普通字符,而是一个原始字符------所见即所得
    单引号,双引号,三引号都支持前面加r,实现不转义

    >>> print('\\\t\\')
    \       \
    >>> print(r'\\\t\\')
    \\\t\\
    
    >>> print('c:\northwind\northwest')  #\n被转义为回车换行
    c:
    orthwind
    orthwest
    >>> print('c:\\northwind\\northwest')
    c:\northwind\northwest
    >>> print(r'c:\northwind\northwest')
    c:\northwind\northwest
    
    1.3 字符串操作与运算

    1.3.1 字符大小写
    字符串函数:title()首字母大写, upper()大写, lower()小写

    name= "Sunny Sun"
    print("name.lower:", name.lower())
    print("name.upper:", name.upper())
    print("name.title:", name.title())
    
    执行结果:
    name.lower: sunny sun
    name.upper: SUNNY SUN
    name.title: Sunny Sun
    

    1.3.2 字符串删除空白
    rstrip()(确保字符串末尾没有空白)
    lstrip()(确保字符串开头没有空白)
    strip() (确保字符串两端没有空白)
    上述方法不会改变原值,依然包含空白

    print("Languages:\n\tPython\n\tC\n\tJavaScript")
    
    favorite_language = 'python '
    print(favorite_language + '23')
    print(favorite_language.rstrip() + '23')
    
    favorite_language = ' \tpython'
    print(favorite_language)
    print(favorite_language.lstrip())
    
    favorite_language = ' \tpython\t '
    print(favorite_language + '23')
    print(favorite_language.strip() + '23')
    
    执行结果:
    Languages:
            Python
            C
            JavaScript
    python 23
    python23
            python
    python
            python   23
    python23
    
    

    1.3.3 + 字符串拼接

    first_name = "denny"
    last_name = "lv"
    full_name = first_name + " " + last_name
    
    message = "Hello, " +  full_name.title() + "!"
    print(message)
    
    执行结果:
    Hello, Denny Lv!
    

    1.3.4 * 字符串重复叠加
    字符串重复
    只能与整数相乘(0 或负整数,输出'')

    print('World'  * 3)
    
    执行结果:
    WorldWorldWorld
    

    1.3.5 访问索引
    通过索引访问对应字符串中的字符,获取对应位置字符
    整数——从0开始取

    >>> s = 'Sunny'
    >>> s[0]
    'S'
    >>> s[1]
    'u'
    >>> s[4]
    'y'
    

    负数——字符串末尾开始倒着取

    >>> s = 'Sunny'
    >>> s[-1]
    'y'
    >>> s[-2]
    'n'
    >>> s[-5]
    'S'
    

    辅助理解与记忆:
    复制原理:helloworld向左复制一份 ======> helloworldhelloworld ======> 0开始向右+1,向左减-1

    1.3.6 子字符串访问
    获取字符串中的子字符串
    截取(正截取,反截取):负数的意义同获取单个字符串时相同
    [x:y] x到y-1 截取到尾标识前面这位
    [x:] x到尾 截取到尾
    [:y] 头到y-1 从头截取到标识前面这位

    >>> s = 'Hello,Python World'
    >>> s[0:5]
    'Hello'
    >>> s[6:12]
    'Python'
    >>> s[13:18]
    'World'
    
    >>> s[0:-13]
    'Hello'
    >>> s[-12:12]
    'Python'
    >>> s[-12:-6]
    'Python'
    
    >>> s[0:]
    'Hello,Python World'
    >>> s[:18]
    'Hello,Python World'
    >>> s[-17:]
    'ello,Python World'
    >>> s[-18:]
    'Hello,Python World'
    >>> s[-19:]
    'Hello,Python World'
    >>> s[:]
    'Hello,Python World'
    

    2.数字

    2.1 整数 int

    Python可以处理任意大小的整数,当然包括负整数,在程序中的表示方法和数学上的写法一模一样。如23,24,-7,2020等

    • 整数无限精度,理论上可以表示无穷大的数,除非内存溢出
    • 与其他语言的区别:
      其他语言区分short,int,long,比如Java;
      python2有int,long 之分, python3中不做区分

    多进制表示与转换
    十进制 转十进制 int()
    二进制 0b开头(字母大小写均可) 转二进制 bin()
    八进制 0o开头(字母大小写均可) 转八进制 oct()
    十六进制 0x开头(字母大小写均可) 转十六进制 hex()

    Q:多进制的表示和转换是否同样适用浮点数?
    A:Python中并不支持浮点数进行上述表示与转换

    2.2 浮点数 float

    浮点数也就是小数,之所以称为浮点数,是因为按照科学记数法表示时,一个浮点数的小数点位置是可变的,比如,1.23x109和12.3x108是完全相等的。
    浮点数可以用数学写法,如1.23,3.14,-9.01,等等。但是对于很大或很小的浮点数,就必须用科学计数法表示,把10用e替代,1.23x10^9就是1.23e9,或者12.3e8,0.000012可以写成1.2e-5,等等。

    整数和浮点数在计算机内部存储的方式是不同的,整数运算永远是精确的,而浮点数运算则可能会有四舍五入的误差。
    结果包含的小数位数可能不确定的,如下所示:
    例1

    >>> 0.2 + 0.1
    0.30000000000000004
    >>> 3 * 0.1
    0.30000000000000004
    

    例2

    dollar = 100
    curr_rate = 7.127
    
    print(dollar * curr_rate)
    
    print('{dol}美元能兑换{cny}人民币'.format(dol=dollar, cny= dollar * curr_rate))
    
    SunnyiMac: Sunny$ python3 test.py
    712.6999999999999
    100美元能兑换712.6999999999999人民币
    

    产生计算误差是因为CPU的浮点运算单元导致的,不可避免,如果需要实现精确计算需要引入一个 decimal 库,后续有时间再深入探讨。//TODO

    与其他语言的区别:
    其他很多语言是区分单双精度的:单精度 float;双精度 double 比如Java。
    python无单双精度之分,其实是双精度。

    2.3 complex复数

    在数字字面值末尾加上 'j' 或 'J' 会生成虚数(实部为零的复数),你可以将其与整数或浮点数相加来得到具有实部和虚部的复数

    2.4 基础算术运算

    所有数字类型(复数除外)都支持下列运算基础算术运算
    Python 完全支持混合算术:当一个二元运算符用于不同数字类型的操作数时,具有“较窄” 类型的操作数会被扩展为另一个操作数的类型,整数比浮点数更窄,浮点数又比复数更窄。 混合类型数字之间的比较也使用相同的规则。

    运算 结果 注释
    x + y 加: x 和 y 的和
    x - y 减: x 和 y 的差
    x * y 乘: x 和 y 的乘积
    x / y 除: x 和 y 的商 两个int操作数,结果为float
    x // y 整除: x 和 y 的商数 1. 只保留整数部分 2//2, 结果为int。 2.运算结果总是向负无穷的方向舍入 1//2 为 0, (-1)//2 为 -1, 1//(-2) 为 -1 而 (-1)//(-2) 为 0。
    x % y 取模 C/C++, C#, JAVA, PHP %是取余;Python中% 是取模。取余运算在计算商值向0方向舍弃小数位;取模运算在计算商值向负无穷方向舍弃小数位
    -x x 取反
    +x x 不变
    abs(x) x 的绝对值或大小
    int(x) 将 x 转换为整数
    float(x) 将 x 转换为浮点数
    complex(re, im) 一个带有实部 re 和虚部 im 的复数。im 默认为0。
    c.conjugate() 复数 c 的共轭 两个实部相等,[虚部]互为相反数的复数互为共轭复数
    divmod(x, y) (x // y, x % y)
    pow(x, y) x 的 y 次幂
    x ** y x 的 y 次幂

    3.布尔值

    整数的子类型 表示真假
    布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False,在Python中,可以直接用True、False表示布尔值(请注意大小写),也可以通过布尔运算计算出来:

    >>> True
    True
    >>> False
    False
    >>> 3 > 2
    True
    >>> 3 > 5
    False
    

    True:
    非0值,非空字符串,非空列表,非空元组,非空字典为True
    False:
    0值,空字符串,空列表,空元组,空字典,None为False

    3.1转换函数:bool函数
    >>> bool(0)
    False
    >>> bool(1)
    True
    >>> bool(-1)
    True
    >>> bool(1.1)
    True
    >>> bool(-1.1)
    True
    >>> bool([])
    False
    >>> bool([1,])
    True
    
    3.2 布尔值逻辑运算:and、or和not运算。
    • and运算是与运算,只有所有都为True,and运算结果才是True:
    >>> True and True
    True
    >>> True and False
    False
    >>> False and False
    False
    >>> 5 > 3 and 3 > 1
    True
    
    • or运算是或运算,只要其中有一个为True,or运算结果就是True:
    >>> True or True
    True
    >>> True or False
    True
    >>> False or False
    False
    >>> 5 > 3 or 1 > 3
    True
    
    • not运算是非运算,它是一个单目运算符,把True变成False,False变成True:
    >>> not True
    False
    >>> not False
    True
    >>> not 1 > 2
    True
    

    4.空值

    空值是Python里一个特殊的值,用None表示。None不能理解为0,因为0是有意义的,而None是一个特殊的空值。

    此外,Python还提供了列表、字典等多种数据类型,还允许创建自定义数据类型,我们后面会继续讲到。

    加餐:

    取余与取模的差别

    通常取模运算也叫取余运算,它们返回结果都是余数 rem 和 mod 唯一的区别在于:
    当 x 和 y 的正负号一样的时候,两个函数结果是等同的;当 x 和 y 的符号不同时,rem 函数结果的符号和 x 的一样,而 mod 和 y 一样。

    这是由于这两个函数的生成机制不同,rem 函数采用 fix 函数,而 mod 函数采用了 floor 函数(这两个函数都是用来取整的,fix 函数向 0 方向舍入,floor 函数向无穷小方向舍入)。
    rem(x,y)命令返回的是 x-ny,如果 y 不等于 0,其中的 n = fix(x/y),而 mod(x,y) 返回的是 x-ny,当 y 不等于 0 时,n=floor(x/y)

    公式1:

    对于整型数x,y来说,取模运算或者求余运算的方法都是:
    1.求整数商: n = x/y;
    2.计算模或者余数: r = x - n*y;

    求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。

    Java 取余

    public class Test {
        public static void main(String []args) {
                    int a = 36;
            int b = 10;
            System.out.println(a + "  " + b + "整除:" + a/b);
            System.out.println(a + "  " + b + "取余:" + a%b);
    
            System.out.println("-----");
    
            int c = -36;
            int d = 10;
            System.out.println(c + "  " + d + "整除:" + c/d);
            System.out.println(c + "  " + d + "取余:" + c%d);
    
            System.out.println("-----");
    
            int e = 36;
            int f = -10;
            System.out.println(e + "  " + f + "整除:" + e/f);
            System.out.println(e + "  " + f + "取余:" + e%f);
    
            System.out.println("-----");
    
            int g = -36;
            int h = -10;
            System.out.println(g + "  " + h + "整除:" + g/h);
            System.out.println(g + "  " + h + "取余:" + g%h);
        }
    }
    
    执行输出:
    36  10整除:3
    36  10取余:6
    -----
    -36  10整除:-3
    -36  10取余:-6
    -----
    36  -10整除:-3
    36  -10取余:6
    -----
    -36  -10整除:3
    -36  -10取余:-6
    

    Python 取模

    a = 36;
    b = 10;
    print('%d // %d = %d' % (a, b, a//b))
    print('%d %% %d = %d' % (a, b, a%b))
    
    a = -36;
    b = 10;
    print('%d // %d = %d' % (a, b, a//b))
    print('%d %% %d = %d' % (a, b, a%b))
    
    a = 36;
    b = -10;
    print('%d // %d = %d' % (a, b, a//b))
    print('%d %% %d = %d' % (a, b, a%b))
    
    a = -36;
    b = -10;
    print('%d // %d = %d' % (a, b, a//b))
    print('%d %% %d = %d' % (a, b, a%b))
    
    执行输出:
    36 // 10 = 3
    36 % 10 = 6
    -36 // 10 = -4
    -36 % 10 = 4
    36 // -10 = -4
    36 % -10 = -4
    -36 // -10 = 3
    -36 % -10 = -6
    

    公式2:(只针对两个异号整数,并只针对取模)

    异号整数取模有另一条逻辑公式
    先将两个整数看作是正数,再作除法运算:
    1、能整除时,其值为 0
    2、不能整除时,其值=除数×(整商+1)-被除数
    3、最后调整正负号:模与除数符合要求保持一致除数是正,余数就是正; 除数是负,余数就是负
    例:mod(36,-10)=-4
    即:36 除以 10 的整数商为 3,加 1 后为 4;其与除数之积为 40;再与被数之差为(40-36=4);取除数的符号。所以值为 -4。

    取余取模的详细计算

    rem(36, 10)
    36-fix(36/10)*10 = 36-3*10=6
    mod(36, 10)
    36-floor(36/10)*10 = 36-3*10 = 6
    
    rem(-36, 10)
    (-36)-fix((-36)/10)*10 = (-36)-(-3)*10=-6
    mod(-36, 10)
    (-36)-floor((-36)/10)*10 = (-36)-(-4)*10 = 4
    公式2:10*(floor(36/10)+1)-36 = 10*4 -36 = 4  除数保持一致,所有4
    
    rem(36, -10)
    36-fix(36/(-10))*(-10) = 36-(-3)*(-10)=6
    mod(36, -10)
    36-floor(36/(-10))*(-10) = 36-(-4)*(-10)=-4
    公式2:10*(floor(36/10)+1)-36 = 10*4 -36 = 4  除数保持一致,所有-4
    
    rem(-36, -10)
    (-36)-fix((-36)/(-10))*(-10) = (-36)-3*(-10)=-6
    mod(-36, -10)
    (-36)-floor((-36)/(-10))*(-10) = (-36)-3*(-10)=-6
    

    扩展

    1. 关于字符串格式化
      参见
      文本序列类型 --- str
      字符串是一种 序列类型 ,因此也支持序列类型的各种操作。
      字符串的方法
      字符串支持许多变换和查找的方法。
      格式化字符串字面值
      内嵌表达式的字符串字面值。
      格式字符串语法
      使用 str.format() 进行字符串格式化。
      printf 风格的字符串格式化
      这里详述了使用 % 运算符进行字符串格式化。

    2. 计算机中浮点数的二进制表示方法?浮点数运算的精确性问题?//TODO

    3. 除 整除底层逻辑? //TODO

    相关文章

      网友评论

        本文标题:6.Python基础语法---02基础数据类型

        本文链接:https://www.haomeiwen.com/subject/tepmkhtx.html