python基础-01

学习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的应用环境

例子:


python基础-01_第1张图片
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)