python基础-01

作者: 张老三168 | 来源:发表于2018-04-09 13:15 被阅读0次

    学习python一年多,之前在cnblog上写博客,偶然的机会看到一个简书上的一篇文章,作者学习能力和笔记方面做的非常好,一来想学习学习,二来可以接触下简书的博客系统,同时希望可以认识更多更加优秀有趣的朋友!

    python编码

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    print('python编码')
    

    Python 变量类型

    Python有五个标准的数据类型:Numbers(数字)String(字符串)List(列表)Tuple(元组)Dictionary(字典)

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    num = 10  #数值型
    str = 'hello world' #字符串型
    list = ['a','b','c',1,2,3]  #列表 可以通过下表(偏移)指定输出列表中的指定元素 从左到右0开始,从右左-1开始
    tuple = ('a','b','c',1,2,3) #元组 可以通过下表指定输出列表中的指定元素 从左到右0开始,从右左-1开始 元素不能呗二次赋值 相当于是只读列表
    dict = {'name':'mike','age':18} #字典 为无序的对象集合 通过键去访问对应的元素
    
    print(type(num))
    print(type(str))
    print(type(list))
    print(type(tuple))
    print(type(dict))
    

    Python数据类型转换

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    print(int(1.1)) # 转换成整型 这里要注意的是转型的字符串仅仅包含数字 要不会报错的
    
    #c = long(b) # python3 之后没有long, 直接采用int转换成整型
    
    print(float(10)) # 转换成浮点型
    
    e = complex(1,2) # 创建一个复数
    
    print(str(10)) # 转换成字符串
    
    print(repr(10)) # 转换为表达式字符串
    
    num1 = 10
    num2 = 20
    print(eval('num1 + num2'))# 将字符串str当成有效的表达式来求值并返回计算结果
    
    s = ['a','b','c',1,2,3]
    print(tuple(s)) # 将序列 i 转换为一个元组
    
    s = ('a','b','c',1,2,3)
    print(list(s)) # 将元组 s 转换为一个序列
    
    s = {11,22,33,44}
    print(set(s)) # 转换为可变集合
    
    print(dict(one=1,two=2)) # 创建一个字典
    
    print(frozenset(s))  # 转换为不可变集合
    
    print(chr(48)) # chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符
    
    # print(unichr(48))  # python3 没有用unichar函数 直接用chr替换
    
    print(ord(u'\u2345'))  # 将一个字符转换为它的整数值
    
    print(hex(10)) # 将一个整数转换为一个十六进制字符串
    
    print(oct(10)) # 将一个整数转换为一个八进制字符串
    

    Python 运算符

    Python算术运算符

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    a = 2
    b = 3
    
    print(a + b) #加
    
    print(a - b) #减
    
    print(a * b) #乘
    
    print(a / b) #除
    
    print(a % b) #取模
    
    print(a ** b) #幂 相当于是 a的b次方
    
    print(b // a) #取整除
    
    

    Python 条件语句

    if 判断条件:
    执行语句……
    else:
    执行语句……

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    salary = 20000
    
    if(salary > 15000):
        print('勉强可以养活自己!')
    else:
        print('兄弟,回家种田吧!')
    

    python不支持switch, 如果有多种情况的判断的话,可以采用ifelseif实现
    if 判断条件:
    执行语句……
    elif判断条件:
    执行语句……

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    salary = 20000
    
    if(salary > 50000):
        print('土豪我们做朋友吧!')
    elif(salary > 30000):
        print('小资生活!')
    elif(salary > 15000):
        print('勉强可以养活自己!')
    else:
        print('兄弟,回家种田吧!')
    

    Python 循环语句

    Python for 循环语句

    #!/usr/bin/env python
    # -*- coding: UTF-8 -*-
    
    #################对字符串的循环读取 #####################
    str = '广州';
    for i in str:
        print(i)
    
    #################对列表的循环读取 #####################
    list = [10,20,30,50]
    new_list = []
    for i in list:
        if(i >= 19):
            # print(i)
            new_list.append(i)  #追加到新的列表
        # else:
        #     print(i)
        #     list.remove(i)         #删除列表中的元素  这里发现了个问题 如果删除后 列表的偏移量(指针)应该会重新排列,会导致 值为20的在循环中被忽略掉 最好用重新赋值到一个新的列表的形式
    print(list)
    print(new_list)
    
    
    #################对元组的循环读取 #####################
    
    tuple = ('a','b','c',1,2,3)
    new_tuple = ()
    for i in tuple:
        if(isinstance(i,int)):
            print(i)
    
    
    #################对字典的循环读取 #####################
    
    dict = {'name':'mike','age':18,'job':'engineer'}
    
    for i in dict: #这里的i是字典的key 这里循环输出的顺序很有意思,好像按照key的第一个字母的正序输出
        # print(i)
        print(dict[i])
    
    for key,value in dict.items(): # 对键和值都进行遍历
        print(key)
        print(value)
    
    

    Python While循环语句

    a = 10
    b = 20
    
    while(a < b):
        print(a)
        a = a +1
    
    

    Python 循环嵌套

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    i = 2
    while(i < 100):
       j = 2
       while(j <= (i/j)):
          if not(i%j): break
          j = j + 1
       if (j > i/j) :
           print(i, " 是素数")
       i = i + 1
    
    print("Good bye!")
    
    

    break 和 continue的区别:break是直接终止整个循环,continue是终止当前次的循环继续下一次循环

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    list = ['a','b',1,2,10,30,'c']
    for i in list:
        if(isinstance(i,str)):
            print(i)
        else:
            # continue
            break
    

    Python 日期和时间

    Time模块

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import time # 引入time模块
    
    print(time.time())  # 返回当前时间的时间戳(1970纪元后经过的浮点秒数)
    
    localtime = time.localtime(time.time())
    print ("本地时间为 :", localtime) # 返回当前的时间元组
    
    localtime = time.asctime( time.localtime(time.time()) )
    print("本地时间为 :", localtime) # 返回格式化的时间
    
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 返回自定义的格式日期
    

    日历(Calendar)模块

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import calendar
    
    cal = calendar.month(2016, 1)
    print("以下输出2016年1月份的日历:")
    print(cal)
    

    Python 函数

    函数相当于是封装好的一个代码块,可以提供应用的模块性和代码的重用性,可以分为内置函数和自定义函数
    自定义函数的规则:

    • 函数代码块以def关键词开头,后接函数标识符名称和圆括号()。
    • 任何传入参数和自变量必须放在圆括号中间。圆括号之间可以用于定义参数。
    • 函数的第一行语句可以选择性地使用文档字符串—用于存放函数说明。
    • 函数内容以冒号起始,并且缩进。
    • Return[expression]结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回 None。
    
    !/usr/bin/python
    # -*- coding: UTF-8 -*-
    import time
    
    #函数的定义
    def myfun():
        print('当前时间是:',time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))
    
    #函数的定义
    def person(name,age): #name age为变量 可以对其进行初始
        print('名字:',name,'年龄',age)
    
    #函数的调用
    myfun()
    
    #函数的调用
    person('mike',18)
    

    按值传递参数和按引用传递参数:
    所有参数(自变量)在Python里都是按引用传递。如果你在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    def changeParameter(data):
        data.append(123)
        print('函数内的参数:',data) #函数内的参数
    
    data = [10,20]
    changeParameter(data)
    
    print('函数外的参数:',data)
    

    参数
    以下是调用函数时可使用的正式参数类型:

    • 必备参数 必备参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样
    • 命名参数 使用关键字参数允许函数调用时参数的顺序与声明时可以不一致,因为 Python 解释器能够用参数名匹配参数值
    • 缺省参数 调用函数时,缺省参数的值如果没有传入,则被认为是默认值
    • 不定长参数 如果调用的时候的参数比声明的要多情况下,可采用不定长参数 加了星号(*)的变量名会存放所有未命名的变量参数
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    def useParamer(name,age=18):
        print('名字:',name,'年龄:',age)
    
    useParamer(name='mike')
    
    def useParamer(name,age):
        print('名字:',name,'年龄:',age)
    
    useParamer(age = '20',name='lina')
    
    
    def printinfo(arg1, *vartuple):
        "打印任何传入的参数"
        print("输出: ")
        print(arg1)
        for var in vartuple:
            print(var)
        return
    
    printinfo(10)
    printinfo(70, 60, 50)
    

    匿名函数
    python 使用 lambda 来创建匿名函数:

    • lambda只是一个表达式,函数体比def简单很多
    • lambda的主体是一个表达式,而不是一个代码块。仅仅能在lambda表达式中封装有限的逻辑进去
    • lambda函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数
    • 虽然lambda函数看起来只能写一行,却不等同于C或C++的内联函数,后者的目的是调用小函数时不占用栈内存从而增加运行效率

    lambda函数的语法只包含一个语句:lambda [arg1 [,arg2,.....argn]]:expression

    # coding=utf-8
    # !/usr/bin/python
    
    # 定义匿名函数
    sum = lambda arg1, arg2: arg1 * arg2;
    
    # 调用sum函数
    print("Value of total : ", sum(10, 20))
    print("Value of total : ", sum(20, 20))
    
    

    变量和局部变量:

    • 定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域
    • 局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中
    # coding=utf-8
    # !/usr/bin/python
    
    num = 2
    
    def myfun():
        global num # 函数内部想访问函数外的全局变量需要 加上global关键字
        num = num +1
        print(num)
    
    myfun()
    
    print(num)
    

    Python 模块

    简单的讲模块就是个.py后缀的文件,使用模块可以是应用的代码更加的清晰,模块中可以定义变量,函数和类,同时也可以包含可执行代码
    import 语句
    如果想要在一个python文件中导入另外一个python文件,那么可以采用import语句,解析器搜索路径下的模块就会将其导入,然后就可以在当前模块下直接调用导入模块的函数了
    语法:

    • import module1[, module2[,... moduleN] 导入模块
    • from modname import name1[, name2[, ... nameN]] 导入模块中的指定部分
    • from…import* 导入模块中的全部内容
    # coding=utf-8
    # !/usr/bin/python
    
    import time #导入time模块
    
    print(time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()))  # 调用time模块中的函数解决时间业务需求
    

    定位模块
    当import导入一个模块时,底层Python解析器对模块位置的搜索顺序是:

    • 当前目录
    • 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录
    • 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/

    模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录

    PYTHONPATH变量
    作为环境变量,PYTHONPATH由装在一个列表里的许多目录组成。PYTHONPATH的语法和shell变量PATH的一样。

    • 在Windows系统,典型的PYTHONPATH:set PYTHONPATH=c:\python20\lib
    • 在UNIX系统,典型的PYTHONPATH如下:set PYTHONPATH=/usr/local/lib/python

    dir()函数
    dir()函数一个排好序的字符串列表,内容是一个模块里定义过的名字

    # coding=utf-8
    # !/usr/bin/python
    
    import time #导入time模块
    
    print(dir())
    
    # OUTPUT : ['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'time']
    

    在这里,特殊字符串变量name指向模块的名字,file指向该模块的导入文件名

    globals()和locals()函数

    • 根据调用地方的不同,globals()和locals()函数可被用来返回全局和局部命名空间里的名字。
    • 如果在函数内部调用locals(),返回的是所有能在该函数里访问的命名。
    • 如果在函数内部调用globals(),返回的是所有在该函数里能访问的全局名字。
    • 两个函数的返回类型都是字典。所以名字们能用keys()函数摘取。
    # coding=utf-8
    # !/usr/bin/python
    
    num1 = 10
    
    def myfun():
        num2 = 20
        num3 = 30
        sum = num2 + num3
    
        print('函数里访问的命名',locals())
        print('函数里能访问的全局名',globals())
    
    myfun()
    
    print('函数外调用locals',locals())
    print('函数外调用globals',globals())
    
    print(type(locals()))
    
    #输出的是字典类型数据
    

    reload()函数
    当一个模块被引入一个执行脚本时,代码只会从上至下执行一次,如果想重新执行模块里顶层部分的代码,可以用reload()函数。该函数会重新导入之前导入过的模块
    语法:reload(module_name)

    Python中的包
    包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的Python的应用环境

    例子:


    image.png

    demo01.py 模块

    # coding=utf-8
    # !/usr/bin/python
    
    import pack
    
    pack.ones() #调用pack包中one模块的ones方法
    
    pack.twos() #调用pack包中two模块的twos方法
    

    pack包下分别有:
    one模块( ones()函数 )
    two模块( twos()函数 )

    # pack目录下创建___init__.py文件模块 使用显式的导入语句
    from .one import ones
    from .two import twos
    

    这里包的引入模块原理应该是impot引入一个包的时候,会先执行init.py文件,先加载init.py文件中的引入模块,这样在当前的demo.py文件中只需引入pack包就可以直接调用包里面模块的函数

    Python 文件I/O

    打开和关闭文件
    open()函数
    open()函数打开一个文件,创建一个文件,然后就可以调用相关的辅助方法才可以调用它进行读写
    语法:file object = open(file_name [, access_mode][, buffering])
    参数:

    • file_name:file_name变量是一个包含了你要访问的文件名称的字符串值
    • access_mode:access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)
    • buffering:如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认
    模式 价格
    r 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    rb 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    r+ 打开一个文件用于读写。文件指针将会放在文件的开头。
    rb+ 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    w 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    w+ 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    wb+ 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    ab 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    a+ 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    ab+ 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。

    file对象的属性

    属性 描述
    file.closed 返回true如果文件已被关闭,否则返回false。
    file.mode 返回被打开文件的访问模式。
    file.name 返回文件的名称。
    file.softspace 如果用print输出后,必须跟一个空格符,则返回false。否则返回true。
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    #打开文件
    fo = open('test.txt')
    
    print(fo.closed)  # 检测文件是否已打开
    print(fo.mode)    # 返回文件的模式
    print(fo.name)    # 返回文件名
    # print(fo.softspace)  python3 没有该属性
    

    file对象的方法
    read()方法

    • read()方法从一个打开的文件中读取一个字符串。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字
    • 语法:fileObject.read([count]);
    • 参数:被传递的参数是要从已打开文件中读取的字节计数。该方法从文件的开头开始读入,如果没有传入count,它会尝试尽可能多地读取更多的内容,很可能是直到文件的末尾
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    #打开文件
    fo = open('test.txt','r+')
    
    print(fo.read(12))  # 读取文件
    
    fo.close()       # 关闭文件
    

    Write()方法

    • Write()方法可将任何字符串写入一个打开的文件。需要重点注意的是,Python字符串可以是二进制数据,而不是仅仅是文字。
    • Write()方法不在字符串的结尾不添加换行符('\n')
    • 语法 fileObject.write(string)
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    #打开文件
    fo = open('test.txt','a+')
    
    fo.write('骚年加油哦!!!\n')
    
    fo.close()       # 关闭文件
    

    Close()方法

    • File对象的close()方法刷新缓冲区里任何还没写入的信息,并关闭该文件,这之后便不能再进行写入。
      当一个文件对象的引用被重新指定给另一个文件时,Python会关闭之前的文件。用close()方法关闭文件是一个很好的习惯
    • 语法:fileObject.close();

    remove()方法

    • 可以用remove()方法删除文件,需要提供要删除的文件名作为参数
    • 语法:os.remove(file_name)
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import os
    
    os.remove("test.txt")  # 删除文件
    

    Python的目录操作
    所有文件都包含在各个不同的目录下,不过Python也能轻松处理。os模块有许多方法能帮你创建,删除和更改目录
    mkdir()方法

    • 可以使用os模块的mkdir()方法在当前目录下创建新的目录们。你需要提供一个包含了要创建的目录名称的参数
    • 语法:os.mkdir("newdir")
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import os
    
    os.mkdir('test.txt')  # 创建一个目录
    

    chdir()方法

    • 可以用chdir()方法来改变当前的目录。chdir()方法需要的一个参数是你想设成当前目录的目录名称。
    • 语法:os.chdir("newdir")
    
    

    rmdir()方法

    • rmdir()方法删除目录,目录名称以参数传递。
    • 在删除这个目录之前,它的所有内容应该先被清除。
    • 语法:os.rmdir('dirname')
    
    

    Python 异常处理

    什么是异常:

    • 异常即是一个事件,该事件会在程序执行过程中发生,影响了程序的正常执行
    • 一般情况下,在Python无法正常处理程序时就会发生一个异常
    • 异常是Python对象,表示一个错误
    • 当Python脚本发生异常时我们需要捕获处理它,否则程序会终止执行

    异常处理:

    • 捕捉异常可以使用try/except语句
    • try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理
    • 如果你不想在异常发生时结束你的程序,只需在try里捕获它

    try的工作原理:

    当开始一个try语句后,python就在当前程序的上下文中作标记,这样当异常出现时就可以回到这里,try子句先执行,接下来会发生什么依赖于执行时是否出现异常。

    • 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
    • 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
    • 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    try:
        int('a')
    except:
        print('int()方法,参数需要为数字 要不会报错')
    else:
        print('OK')
    

    try-finally 语句
    try-finally 语句无论是否发生异常都将执行最后的代码

    python与Java的异常处理模式相似,异常处理语句也可以嵌套
    如果外层try子句中的代码引发异常,程序将直接跳转到外层try对应的except子句,而内部的try子句将不会被执行

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    try:
         s = "hello"
         try:
              print(s[0] + s[1])
              print(s[0] - s[1])
         except TypeError:
              print("字符串不支持减法运算")
    except:
         print("异常")
    
    

    raise抛出异常 捕捉异常

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    num = 2
    
    try:
        if(num > 1):
            raise Exception(num,'大于1')
        elif(num < 1):
            raise Exception(num,'小于1')
        else:
            raise Exception(num,'等于1')
    except Exception as e:
            print(e)
    

    Exception 源码

    class Exception(BaseException):
        """ Common base class for all non-exit exceptions. """
        def __init__(self, *args, **kwargs): # real signature unknown
            pass
    
        @staticmethod # known case of __new__
        def __new__(*args, **kwargs): # real signature unknown
            """ Create and return a new object.  See help(type) for accurate signature. """
            pass
    

    相关文章

      网友评论

        本文标题:python基础-01

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