python基础

1.python关键字

and     as      assert     break     class      continue    def     del
elif    else    except     exec      finally    for         from    global
if      in      import     is        lambda     not         or      pass
print   raise   return     try       while      with        yield

可以在Python Shell通过以下命令进行查看当前系统中python的关键字

>>> import keyword
>>> keyword.kwlist

2.字符串的常见操作 

 1. find

检测 str 是否包含在 mystr中,如果是返回开始的索引值,否则返回-1

mystr.find(str, start=0, end=len(mystr))

 

 

2. index

跟find()方法一样,只不过如果str不在 mystr中会报一个异常.

mystr.index(str, start=0, end=len(mystr)) 

 

 3.列表的排序

1.sorted()函数

返回一个新的已排序列表,而不会改变原始列表。

reverse=True 反向排序

key 进行自定义规则排序

original_list = [3, 1, 2, 5, 4]
sorted_list = sorted(original_list)
print(sorted_list)  # 输出 [1, 2, 3, 4, 5]
print(original_list)  # 输出 [3, 1, 2, 5, 4]

2.sort()函数

 不返回新的列表,直接修改原始列表

original_list = [3, 1, 2, 5, 4]
original_list.sort()
print(original_list)  # 输出 [1, 2, 3, 4, 5]

 3.自定义排序规则

words = ["apple", "banana", "cherry", "date"]
sorted_words = sorted(words, key=len)
print(sorted_words)  # 输出 ['date', 'apple', 'cherry', 'banana']

4.多个条件进行排序

 

items = [(2, "apple"), (1, "banana"), (3, "cherry"), (2, "date")]
sorted_items = sorted(items, key=lambda x: (x[0], x[1]))
print(sorted_items)
# 输出 [(1, 'banana'), (2, 'apple'), (2, 'date'), (3, 'cherry')]

5. enumerate()

enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。

>>> chars = ['a', 'b', 'c', 'd']
>>> for i, chr in enumerate(chars):
...     print i, chr
...
0 a
1 b
2 c
3 d

 

4.函数 

1.参数

  • 在形参中默认有值的参数,称之为缺省参数
  • 注意:带有默认值的参数一定要位于参数列表的最后面

 

  • >>> def printinfo(name, age=35, sex):
      ...     print name
      ...
        File "<stdin>", line 1
      SyntaxError: non-default argument follows default argument
    

缺省参数在*args后面

def sum_nums_3(a, *args, b=22, c=33, **kwargs):
    print(a)
    print(b)
    print(c)
    print(args)
    print(kwargs)

sum_nums_3(100, 200, 300, 400, 500, 600, 700, b=1, c=2, mm=800, nn=900)

 

  • 如果很多个值都是不定长参数,那么这种情况下,可以将缺省参数放到 *args的后面, 但如果有**kwargs的话,**kwargs必须是最后的

 2.拆包

除了对元组拆包之外,还可以对列表、字典等拆包

 In [17]: a, b = (11, 22)
  In [18]: a
  Out[18]: 11
  In [19]: b
  Out[19]: 22

  In [20]: a, b = [11, 22]
  In [21]: a
  Out[21]: 11
  In [22]: b
  Out[22]: 22

  In [23]: a, b = {"m":11, "n":22}  # 取出来的是key,而不是键值对
  In [24]: a
  Out[24]: 'm'
  In [25]: b
  Out[25]: 'n'

 匿名函数和函数都可以作为参数进行传递,增加代码复用性。

5.高阶函数

 1.map

map() 会根据提供的函数对指定序列做映射.

第一个参数 function 以参数序列中的每一个元素调用 function 函数,返回包含每次 function 函数返回值的新列表.

my_list = [1, 2, 3, 4, 5]


def f(x):
    return x ** 2


result = map(f, my_list)
print(type(result), result, list(result))

2. reduce 用法

reduce() 函数会对参数序列中元素进行累计.

函数将一个数据集合中的所有数据进行下列操作:

  1. 用传给 reduce 中的函数 function(有两个参数)先对集合中的第 1、2 个元素进行操作.
  2. 得到的结果再与第三个数据用 function 函数运算, 最后得到一个结果.

 

import functools

my_list = [1, 2, 3, 4, 5]


def f(x1, x2):
    return x1 + x2


result = functools.reduce(f, my_list)
print(result)

3. filter 用法

filter() 函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象, 如果要转换为列表, 可以使用 list() 来转换.

该接收两个参数, 第一个为函数, 第二个为序列, 序列的每个元素作为参数传递给函数进行判, 然后返回 True 或 False, 最后将返回 True 的元素放到新列表中.

 

my_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]


def f(x):
    return x % 2 == 0


result = filter(f, my_list)
print(list(result))

 6.文件操作

1.文件读写

<1>写数据(write)

demo: 新建一个文件 file_write_test.py,向其中写入如下代码:


f = open('test.txt', 'w')
f.write('hello world, i am here!')
f.close()

 <2>读数据(read)

使用read(num)可以从文件中读取数据,num表示要从文件中读取的数据的长度(单位是字节),如果没有传入num,那么就表示读取文件中所有的数据

demo: 新建一个文件file_read_test.py,向其中写入如下代码:

f = open('test.txt', 'r')
content = f.read(5)  # 最多读取5个数据
print(content)

print("-"*30)  # 分割线,用来测试

content = f.read()  # 从上次读取的位置继续读取剩下的所有的数据
print(content)

f.close()  # 关闭文件,这个可以是个好习惯哦

 <3>读数据(readlines)

就像read没有参数时一样,readlines可以按照行的方式把整个文件中的内容进行一次性读取,并且返回的是一个列表,其中每一行的数据为一个元素


f = open('test.txt', 'r')
content = f.readlines()
print(type(content))

i=1
for temp in content:
    print("%d:%s" % (i, temp))
    i += 1

f.close()

<4>读数据(readline)

#coding=utf-8

f = open('test.txt', 'r')

content = f.readline()
print("1:%s" % content)

content = f.readline()
print("2:%s" % content)


f.close()

readlines读取整个文件的内容,并将其作为一个字符串列表返回,使用场景:当你需要一次性读取文件中的所有行,或者需要将文件内容全部加载到内存中进行进一步处理时,可以使用 readlines()

readline() 方法每次调用只读取文件中的一行内容,并返回这一行作为一个字符串(包括行结束符,:当文件很大或者你希望在读取每一行后立即处理它以减少内存使用时,使用 readline() 更为合适。你可以在循环中连续调用 readline(),直到文件结束。

2.相关操作

1. 文件重命名

import os
os.rename("毕业论文.txt", "毕业论文-最终版.txt")

 

2. 删除文件 

import os
os.remove("毕业论文.txt")

3.创建文件夹

import os
os.mkdir("张三")

4.获取当前目录

import os
os.getcwd()

 

5.改变默认目录

import os
os.chdir("../")

 

6.. 获取目录列表

import os
os.listdir("./")

 

7. 删除文件夹

import os
os.rmdir("张三")

 

 7.面向对象

1.面向对象基础

1.__init__方法:变量初始化或赋值操作,在类实例化对象的时候,会被自动调用。 

2.类内部获取属性和实例方法,通过self获取;在类外部获取 属性 和 实例方法,通过对象名获取。

3.__str__方法:

该方法需要 return 一个数据,并且只有self一个参数,当在类的外部 print(对象) 则打印这个数据

 2.面向对象(二)

1.多继承

  • 注意:如果多个父类中有同名的 属性和方法,则默认使用第一个父类的属性和方法(根据类的魔法属性mro的顺序来查找)

3.面向对象(三)

1.私有权限

 在属性名和方法名 前面 加上两个下划线 __

(1)类的私有属性和私有方法,不可以通过对象直接访问,但是可以在本类内部进行访问

(2)类的私有属性 和 私有方法,都不会被子类继承,也不可以被子类访问

(3)私有属性和私有方法往往用来处理类的内部事情,不通过对象处理,起到安全作用。

2.修改私有属性的值
  1. 对象名.属性名 = 数据 ----> 直接修改
  2. 对象名.方法名() ----> 间接修改
  • 私有属性不能直接访问,所以无法通过第一种方式修改,一般的通过第二种方式修改私有属性的值:定义一个可以调用的公有方法,在这个公有方法内访问修改。

def set_money(self, num):
        self.__money = num

 

# 可以通过访问公有方法set_money()来修改私有属性的值
damao.set_money(100)
3.多态  
1.什么是多态

在需要使用父类对象的地方,也可以使用子类对象, 这种情况就叫多态

比如, 在函数中,我需要调用 某一个父类对象的方法, 那么我们也可以在这个地方调用子类对象的方法

2.在程序中使用多态
1.子类继承父类
2.子类重写父类中的方法
3.通过对象调用这个方法
  # 定义父类
    class Father:
        def cure(self):
            print("父亲给病人治病...")


    # 定义子类继承父类
    class Son(Father):
        # 重写父类中的方法
        def cure(self):
            print("儿子给病人治病...")


    # 定义函数,在里面 调用 医生的cure函数
    def call_cure(doctor):

        # 调用医生治病的方法
        doctor.cure()


    # 创建父类对象
    father = Father()
    # 调用函数,把父类对象传递函数
    call_cure(father)


    # 创建子类对象
    son = Son()
    # 调用函数,把子类对象传递函数
    call_cure(son)

 

3.使用多态的好处

all_cure(doctor)函数传递哪个对象,在它里面就会调用哪个对象的cure()方法,也就是说在它里面既可以调用son对象的cure()方法,也能调用father对象的cure()方法,当然了也可以在它里面调用Father类其它子类对象的cure()方法,这样可以让call_cure(doctor)函数变得更加灵活,额外增加了它的功能,提高了它的扩展性. 

4.类属性和实例属性
1.类属性:

类所拥有的属性,被所有的类对象所共有。

可以通过类对象或者实例对象进行访问

类属性通常用于存储与类相关的常量或共享状态信息。

2.实例属性(对象属性)

实例属性是与类的每个实例关联的变量,每个实例可以有不同的值。实例属性通常在类的初始化方法__init__中定义,并通过实例访问。

通过  实例.属性名或或 self.属性名  进行访问

实例属性用于存储每个实例特有的数据和状态信息。

5.静态方法和类方法和实例方法

1.类方法

是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法。对于类方法,第一个参数必须是类对象,一般以cls作为第一个参数。

能够通过实例对象和类对象去访问。

class People(object):
    country = 'china'

    #类方法,用classmethod来进行修饰
    @classmethod
    def get_country(cls):
        return cls.country

p = People()
print(p.get_country())    #可以用过实例对象引用
print(People.get_country())    #可以通过类对象引用

类方法还有一个用途就是可以对类属性进行修改:

class People(object):
    country = 'china'

    #类方法,用classmethod来进行修饰
    @classmethod
    def get_country(cls):
        return cls.country

    @classmethod
    def set_country(cls,country):
        cls.country = country


p = People()
print(p.get_country())   #可以用过实例对象访问
print(People.get_country())    #可以通过类访问

p.set_country('japan')   

print(p.get_country())
print(People.get_country())
2.静态方法

要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,可以通过对象和类来访问。

class People(object):
    country = 'china'

    @staticmethod
    #静态方法
    def get_country():
        return People.country


p = People()
# 通过对象访问静态方法
p.get_contry()

# 通过类访问静态方法
print(People.get_country())
3.区别
  1. 从类方法和实例方法以及静态方法的定义形式就可以看出来,类方法的第一个参数是类对象cls,那么通过cls引用的必定是类对象的属性和方法;
  2. 实例方法的第一个参数是实例对象self,那么通过self引用的可能是类属性、也有可能是实例属性(这个需要具体分析),不过在存在相同名称的类属性和实例属性的情况下,实例属性优先级更高。可以访问和修改实例属性,也可以调用其他实例方法和类方法。
  3. 静态方法中不需要额外定义参数,因此在静态方法中引用类属性的话,必须通过类实例对象来引用。静态方法类和实例都可以调用。不能访问类属性 类方法 实例属性 实例方法
  4. 装饰器区别:实例(不需要) 类方法(@classmethod) 静态方法(staticmethod)
  5. 调用:实例方法可以通过对象直接调用  类名调用的时候需要创建一个对象 在传递参数的时候把对象传递进去  类方法可以通过类名调用,也可以通过对象调用 静态方法可以通过类名调用,也可以通过对象调用
  6. 类方法不可以访问实例变量 只能访问类变量

8.模块和包

__init__.py 控制着包的导入行为

__init__.py文件中,定义一个__all__变量,它控制着 from 包名 import *时导入的模块 

  • 如果一个文件中有__all__变量,那么也就意味着不是这个变量中的元素,不会被from xxx import *时导入

1.异常传递

    def test1():
        print("----test1-1----")
        print(num)
        print("----test1-2----")


    def test2():
        print("----test2-1----")
        test1()
        print("----test2-2----")


    def test3():
        try:
            print("----test3-1----")
            test1()
            print("----test3-2----")
        except Exception as result:
            print("捕获到了异常,信息是:%s"%result)

        print("----test3-2----")



    test3()
    print("------华丽的分割线-----")
    test2()

 

  • 如果try嵌套,那么如果里面的try没有捕获到这个异常,那么外面的try会接收到这个异常,然后进行处理,如果外边的try依然没有捕获到,那么再进行传递。。。
  • 如果一个异常是在一个函数中产生的,例如函数A---->函数B---->函数C,而异常是在函数C中产生的,那么如果函数C中没有对这个异常进行处理,那么这个异常会传递到函数B中,如果函数B有异常处理那么就会按照函数B的处理方式进行执行;如果函数B也没有异常处理,那么这个异常会继续传递,以此类推。。。如果所有的函数都没有处理,那么此时就会进行异常的默认处理,即通常见到的那样
  • 注意观察上图中,当调用test3函数时,在test1函数内部产生了异常,此异常被传递到test3函数中完成了异常处理,而当异常处理完后,并没有返回到函数test1中进行执行,而是在函数test3中继续执行

2.定位模块

当你导入一个模块,Python解析器对模块位置的搜索顺序是:

  1. 当前目录
  2. 如果不在当前目录,Python则搜索在shell变量PYTHONPATH下的每个目录。
  3. 如果都找不到,Python会察看默认路径。UNIX下,默认路径一般为/usr/local/lib/python/
  4. 模块搜索路径存储在system模块的sys.path变量中。变量里包含当前目录,PYTHONPATH和由安装过程决定的默认目录。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值