美文网首页
Python:基础

Python:基础

作者: DramaScript | 来源:发表于2018-01-11 17:49 被阅读31次

    本笔记是完全与Java和C++语言进行对比,总结Python3与其不同的地方。这样达到一个快速学习与复习的效果。只需要记住不同之处,就可以熟练愉快的敲Python3代码了。

    开发环境的搭建

    • 下载有两种方式(建议第二种)
    1. 官网下载
    2. 第三方下载(提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、切换以及各种第三方包安装问题。)
    • 命令行使用Python
      当你安装成功了,并且已经将Python安装目录中的python.exe所在目录配置好环境变量后,打开CMD,输入python,就可以在>>>符号后敲相应的代码,结果如下图:


      图1.png
    • 安装Python的ide工具
      这里推荐使用PyCharm,下载地址
      下载好后安装,至于如何使用,请参考这个系列的博客(看不到我

    基础

    Python的注释都是以#为开头,并且Python使用缩进来组织代码块,请务必遵守约定俗成的习惯,坚持使用4个空格的缩进。如下面代码

    is_ture = False;
    if is_ture:
        print("哈哈哈,嘎嘎嘎,呱呱呱")
    else:
        print("天王盖地虎小鸡炖蘑菇")
    
    输入与输出
    • print()输出
    print("你的名字是:")
    

    print()函数也可以接受多个字符串,用逗号“,”隔开,就可以连成一串输出,记住每个“,”为一个空格分开,并且这个函数接收大部分类型为参数,如果字符串内部有很多换行,用\n写在一行里不好阅读,为了简化,Python允许用'''...'''的格式表示多行内容。

    print("你的名字是:","吴彦祖")
    

    那么如何输出格式化的字符串?在Python中,采用的格式化方式和C语言是一致的,用%实现,举例如下:

    print("你好,%s"%"世界")
    print("再见,%s go die %s 回来吧"%("小学生","哈哈哈"))
    你好,世界
    再见,小学生 go die 哈哈哈 回来吧
    

    你可能猜到了,%运算符就是用来格式化字符串的。在字符串内部,%s表示用字符串替换,%d表示用整数替换,有几个%?占位符,后面就跟几个变量或者值,顺序要对应好。如果只有一个%?,括号可以省略。如果你不太确定应该用什么,%s永远起作用,它会把任何数据类型转换为字符串。
    有些时候,字符串里面的%是一个普通字符怎么办?这个时候就需要转义,用%%来表示一个%:

    print('growth rate: %d %%' % 7)
    growth rate: 7 %
    

    另一种格式化字符串的方法是使用字符串的format()方法,它会用传入的参数依次替换字符串内的占位符{0}、{1}……,不过这种方式写起来比%要麻烦得多:

    print('Hello, {0}, 成绩提升了 {1:.1f}%'.format('小明', 17.125))
    Hello, 小明, 成绩提升了 17.1%
    
    • input()输入
    name = input()
    print("你的名字是...fwfwg")
    

    来看看下面这个特殊的例子:

    age = input("your age is:")
    # input()返回的数据类型是str,str不能直接和整数比较,必须先把str转换成整数。Python提供了int()函数来完成这件事情
    # 当然有int函数,也有float函数,这就要看输入的是整型还是浮点型了
    birth = int(age)
    if birth>=18:
        print("成年了")
    else:
        print("未成年")
    

    这里有点就是数据类型的转换函数也是int()函数,将一个别的类型的值传入里面,就会转换为int类型。但是注意,转换规则还是和Java一样的。比如float转成int是会报错的。‘a’转成int也是会报错的。

    数据类型与变量
    • 布尔值

    布尔值和布尔代数的表示完全一致,一个布尔值只有True、False两种值,要么是True,要么是False

    • 运算符

    在java中的 |,&,! 在Python中对应and、or和not运算

    • 空值

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

    • 变量
      变量在程序中就是用一个变量名表示了,变量名必须是大小写英文、数字和_的组合,且不能用数字开头
    a = 2
    a = "123"
    a = True
    

    同一个变量可以反复赋值,而且可以是不同类型的变量,这种变量本身类型不固定的语言称之为动态语言,与之对应的是静态语言。静态语言在定义变量时必须指定变量类型,如果赋值的时候类型不匹配,就会报错。例如Java是静态语言

    • 常量
      所谓常量就是不能变的变量,比如常用的数学常数π就是一个常量。在Python中,通常用全部大写的变量名表示常量:
    IP = 124568522
    

    但事实上IP 仍然是一个变量,Python根本没有任何机制保证IP 不会被改变,所以,用全部大写的变量名表示常量只是一个习惯上的用法,如果你一定要改变变量IP 的值,也没人能拦住你。

    • 除法的区别
      在Python中,有两种除法
    >>> 10 / 3
    3.3333333333333335
    

    /除法计算结果是浮点数,即使是两个整数恰好整除,结果也是浮点数

    >>> 9 / 3
    3.0
    

    Python还提供一个余数运算,可以得到两个整数相除的余数

    >>> 10 % 3
    1
    
    • 字符串
      在最新的Python 3版本中,字符串是以Unicode编码的,也就是说,Python的字符串支持多语言,对于单个字符的编码,Python提供了ord()函数获取字符的整数表示,chr()函数把编码转换为对应的字符:
    print("ord:",ord('B'))
    print("chr:",chr(25991))
    ord: 66
    chr: 文
    
    • bytes类型
      Python对bytes类型的数据用带b前缀的单引号或双引号表示,要注意区分'ABC'和b'ABC',前者是str,后者虽然内容显示得和前者一样,但bytes的每个字符都只占用一个字节。
    x = b'ABC'
    

    以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

    encode = 'ABCD'.encode('ascii')
    encode = '中国'.encode('GB2312')
    encode = '中国'.encode('ascii')
    print(encode)
    

    纯英文的str可以用ASCII编码为bytes,内容是一样的,含有中文的str可以用UTF-8编码为bytes。含有中文的str无法用ASCII编码,因为中文编码的范围超过了ASCII编码的范围,Python会报错,在bytes中,无法显示为ASCII字符的字节,用\x##显示。

    反过来,如果我们从网络或磁盘上读取了字节流,那么读到的数据就是bytes。要把bytes变为str,就需要用decode()方法:

    decode = b'ABCD'.decode('ascii')
    print(decode)
    ABCD
    

    如果bytes中包含无法解码的字节,decode()方法会报错:

    decode = b'\xe4\xb8\xad\xff'.decode('utf-8')
    print(decode)
    
    报错:
    Traceback (most recent call last):
      File "F:/Pythonproject/test_dir/__init__.py", line 1, in <module>
        decode = b'\xe4\xb8\xad\xff'.decode('utf-8')
    UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
    

    如果bytes中只有一小部分无效的字节,可以传入errors='ignore'忽略错误的字节:

    decode = b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')
    print(decode)
    

    要计算str包含多少个字符,可以用len()函数:

    print(len("wfowbogqwbvg"))
    print(len(b'avegegg'))
    print(len('中国'.encode('utf-8')))
    12
    7
    6
    

    可见,1个中文字符经过UTF-8编码后通常会占用3个字节,而1个英文字符只占用1个字节。
    在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换。
    由于Python源代码也是一个文本文件,所以,当你的源代码中包含中文的时候,在保存源代码时,就需要务必指定保存为UTF-8编码。当Python解释器读取源代码时,为了让它按UTF-8编码读取,我们通常在文件开头写上这两行:

    #!/usr/bin/env python3
    # -*- coding: utf-8 -*-
    

    第一行注释是为了告诉Linux/OS X系统,这是一个Python可执行程序,Windows系统会忽略这个注释;
    第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

    list和tuple
    • list
      Python内置的一种数据类型是列表:list。list是一种有序的集合,可以随时添加和删除其中的元素。说白了它其实就是可变长度的数组!同样可以用len()函数获取长度。记住这个的用法,就是和java的list集合与数组一样的用法。一样有添加,指定位置插入删除,取元素和数组取元素一样,并且比起java的list集合还牛逼的是她可以存储不同的数据类型,并且也可以嵌套list。下面代码演示以上所有功能:
    test_list = ["哈哈哈" , 2 , 'A' , 5.2361 , [1 , "fegeg"]]
    # 获取长度
    print(len(test_list))
    # 去第一个元素
    print(test_list[0])
    # 用-1做索引,直接获取最后一个元素,以此类推-2就是倒数第二个元素,注意不要角标越界
    print(test_list[-1])
    # 插入元素
    test_list.append(2)
    # 指定位置添加
    test_list.insert(1,"我很帅")
    # 删除末尾数据
    test_list.pop()
    # 删除指定位置数据
    test_list.pop(2)
    # 改变指定位置的元素
    test_list[1] = 'C'
    # 获取list中的list的指定位置元素
    print(test_list[4][0])
    
    • tuple
      另一种有序列表叫元组:tuple。tuple和list非常类似,但是tuple一旦初始化就不能修改,初始化tuple的是小括号,而list的是中括号。如下:
    test_tuple = (1,2,4,6)
    

    test_tuple这个tuple不能变了,它也没有append(),insert()这样的方法。其他获取元素的方法和list是一样的,你可以正常地使用test_tuple[0],test_tuple[-1],但不能赋值成另外的元素。
    不可变的tuple有什么意义?因为tuple不可变,所以代码更安全。如果可能,能用tuple代替list就尽量用tuple。所以,当你定义一个tuple时,在定义的时候,tuple的元素就必须被确定下来。
    来看看特列:

    # 定义一个空的tuple
    null_tuple = ()
    #  定义一个只有一个元素的tuple,注意下面两个不是同一个意思。
    #  前一个定义的不是tuple,是1这个数!这是因为括号()既可以表示tuple,又可以表示数学公式中的小括号,
    # 这就产生了歧义,因此,Python规定,这种情况下,按小括号进行计算,计算结果自然是1。
    # 所以,只有1个元素的tuple定义时必须加一个逗号,,来消除歧义
    tu1 = (1)
    tu12 = (1,)
    
    If语句

    这个语句和Java与C的区别不大,就是写法不一样,注意不要少了:符号就行了。如下格式就可以了:

    a = 20
    if a>10:
        print(a)
    elif a<30:
        print(30)
    else:
        print(0)
    
    循环

    Python的循环有两种,一种是for...in循环,一种是while,依次把list或tuple中的每个元素迭代出来。

    • for...in
    # range()函数,可以生成一个整数序列,再通过list()函数可以转换为list。比如range(100)生成的序列是从0开始小于100的整数
    sum = 0
    test_for = list(range(100))
    for x in test_for:
        sum = sum + x;
    # 千万记住py的缩进原则,以下代码如果是和for 对其,那么只打印一次,就是最好的结果,如果是和sum = sum + x;对齐那么就会打印每次的循环
    print(sum)
    
    • while
    sum = 0;
    x = 99;
    while x >0:
        sum = sum + x
        x -2
    print(sum)
    
    dict和set
    • dict
      Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。具体用法和Java的map用法差不多,直接看示例吧:
    test_dir = {'a':10,'a':2,'c':3,'d':4,'e':5}
    # 按照key取元素
    print(test_dir['a'])
    # 赋值会覆盖前面的值
    test_dir['b'] = 12
    # 判断key存在的第一种方法,使用in
    print('g' in test_dir)
    # 第二种方式判断key,通过dict提供的get()方法,如果key不存在,可以返回None,或者自己指定的value
    print(test_dir.get('a'))
    print(test_dir.get('y',-1))
    # 删除一个key
    test_dir.pop('a')
    

    你发现了,dir的key是可以重复的,并且后面的key的值会覆盖前面的重复的值。

    • set
      set和dict类似,也是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key。说白了,这个有点像java中的keyset()。
      示例:
    # 要创建一个set,需要提供一个list作为输入集合,注意:重复元素在set中自动被过滤
    s = set([1,2,3,4,4,2,"sddf"])
    # 添加元素到set
    s.add(5)
    # 删除元素
    s.remove(4)
    # set可以看成数学意义上的无序和无重复元素的集合,因此,两个set可以做数学意义上的交集、并集等操作:
    s1 = set([1, 2, 3])
    s2 = set([2, 3, 4])
    print(s1&s2)
    

    set和dict的唯一区别仅在于没有存储对应的value,但是,set的原理和dict一样,所以,同样不可以放入可变对象,因为无法判断两个可变对象是否相等,也就无法保证set内部“不会有重复元素”。试试把list放入set,看看是否会报错

    注意看下面代码,和Java有所不同:

    a = 'abc'
    a.replace('a','A')
    print(a)
    

    输出结果是abc,而不是Abc。原因就是a本身是可不变的对象,第二行代码只是把 'abc'这个值做了变化,这个replace函数执行后生成了新的字符串,地址和a的地址不是同一个。

    相关文章

      网友评论

          本文标题:Python:基础

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