萌新学python3.0 笔记 第4课时 常用函数,sorted , 类与对象

参数分为可变参数(列表,字典,set),不可变参数(string,Number, 元组).

全局变量(声明在函数外,如果在函数内使用则需要 global)
       如:b=10
           del test():
               global b=5

   可变类型的变量为全局变量时。不需要写global,但是不可变类型的对象  为全局变量时则需要声明global


三个大数据重要函数 foo map reduce

foo():

         >>> foo = [2, 18, 9, 22, 17, 24, 8, 12, 27]
         >>> print filter(lambda x: x % 3 == 0, foo)
                 [18, 9, 24, 12, 27]
         >>> print map(lambda x: x * 2 + 10, foo)
                 [14, 46, 28, 54, 44, 58, 26, 34, 64]
         >>> print reduce(lambda x, y: x + y, foo)

                 139


map():

       map()函数接收两个参数,一个是函数,一个是序列,map将传入的函数依次作用到序列的每个元素,并把结果作为新的list返回。
举例说明,比如我们有一个函数f(x)=x%2,要把这个函数作用在一个list [1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map()实现
#使用lambda函数

案例1:
print map(lambda x: x % 2, range(7))
[0, 1, 0, 1, 0, 1, 0]
案例2:
li = [11, 22, 33]

new_list = map(lambda a: a + 100, li)


filter():

           对于序列中的元素进行筛选,最终获取符合条件的序列
li = [11, 22, 33]
new_list = filter(lambda arg: arg > 22, li)
例如,要从一个list [1, 4, 6, 7, 9, 12, 17]中删除偶数,保留奇数,首先,要编写一个判断奇数的函数:
def is_odd(x):
 return x % 2 == 1
然后,利用filter()过滤掉偶数:
>>>filter(is_odd, [1, 4, 6, 7, 9, 12, 17])
结果:
[1, 7, 9, 17]
利用filter(),可以完成很多有用的功能,例如,删除 None 或者空字符串:
def is_not_empty(s):
 return s and len(s.strip()) > 0
>>>filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
结果:
['test', 'str', 'END']
注意: s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。
当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' '),如下:


>>> a = ' 123'
>>> a.strip()
'123'


>>> a = '\t\t123\r\n'
>>> a.strip()
'123'


练习:
请利用filter()过滤出1~100中平方根是整数的数,即结果应该是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
方法:
import math
def is_sqr(x):
 return math.sqrt(x) % 1 == 0
print filter(is_sqr, range(1, 101))
结果:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
python reduce():对于序列内所有元素进行累计操作
li = [11, 22, 33]

result = reduce(lambda arg1, arg2: arg1 + arg2, li)


reduce():

              python中的reduce内建函数是一个二元操作函数,他用来将一个数据集合(链表,元组等)中的所有数据进行下列操作:用传给reduce中的函数 func()(必须是一个二元操作函数)先对集合中的第1,2个数据进行操作,得到的结果再与第三个数据用func()函数运算,最后得到一个结果。
如:
 def myadd(x,y):  
 return x+y  
 sum=reduce(myadd,(1,2,3,4,5,6,7))  
 print sum  
#结果就是输出1+2+3+4+5+6+7的结果即28
当然,也可以用lambda的方法,更为简单:
 sum=reduce(lambda x,y:x+y,(1,2,3,4,5,6,7))  
 print sum 
reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。 


例如,编写一个f函数,接收x和y,返回x和y的和:


def f(x, y):
 return x + y
调用 reduce(f, [1, 3, 5, 7, 9])时,reduce函数将做如下计算:


先计算头两个元素:f(1, 3),结果为4;
再把结果和第3个元素计算:f(4, 5),结果为9;
再把结果和第4个元素计算:f(9, 7),结果为16;
再把结果和第5个元素计算:f(16, 9),结果为25;
由于没有更多的元素了,计算结束,返回结果25。
上述计算实际上是对 list 的所有元素求和。虽然Python内置了求和函数sum(),但是,利用reduce()求和也很简单。


reduce()还可以接收第3个可选参数,作为计算的初始值。如果把初始值设为100,计算:
reduce(f, [1, 3, 5, 7, 9], 100)
结果将变为125,因为第一轮计算是:


计算初始值和第一个元素:f(100, 1),结果为101。


练习:
Python内置了求和函数sum(),但没有求积的函数,请利用reduce()来求积:
输入:[2, 4, 5, 7, 12]
输出:2*4*5*7*12的结果


方法:
def prod(x, y):
 return x*y
print reduce(prod, [2, 4, 5, 7, 12])
结果:

>>>3360


自定义排序函数sorted():

            Python内置的 sorted()函数可对list进行排序:


>>>sorted([36, 5, 12, 9, 21])
[5, 9, 12, 21, 36]
但 sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。




sorted()也可以对字符串进行排序,字符串默认按照ASCII大小来比较:


>>> sorted(['bob', 'about', 'Zoo', 'Credit'])
['Credit', 'Zoo', 'about', 'bob']
'Zoo'排在'about'之前是因为'Z'的ASCII码比'a'小。
.sort()排序方法
shus.sort()对原有列表进行排序,改变原来列表的顺序,无返回值
print(shus)就是改变后的列表
sorted()排序函数
排序时不影响原数据,产生新的排序数据
print(sorted(shus))排序后的结果
print(shus)还是原结果


练习:
对字符串排序时,有时候忽略大小写排序更符合习惯。请利用sorted()高阶函数,实现忽略大小写排序的算法。


输入:['bob', 'about', 'Zoo', 'Credit']


>>> a = ['bob', 'about', 'Zoo', 'Credit']
>>> print(sorted(a, key=str.lower))


结果:
['about', 'bob', 'Credit', 'Zoo']



类与对象:

类:具有相同的属性和方法的对象的集合。
对象:万物皆对象 var date=new Date();date.get
类和对象的关系:
类的包含属性和方法:
语法:
class 类名:
 属性
 方法
 定义一个类:
class Person:
 def eat(self):
 print("正在吃饭...")
 def sleep(self):
 print("正在睡觉...")
创建对象:属性写在类外的情况,就是通过对象.属性,对象.方法()的方式调用
调用对象的方法:
创建多个对象:
self:
__init__(self):系统自动调用初始化方法,先生成对象,再调用此方法,再将对象赋值给引用名
 初始化操作
如果做全局属性:
例:
class Person:
 def __init__(self,v_name,v_age):
 self.name=v_name
 self.age=v_age
 def say(self):
 print("hello")
生成对象:
zhangsan=Person()
zhangsan.name="张三"
zhangsan.age=20
zhangsan.say()
__str__():
 return XXX
属性相对于类来说属于全局,每个方法都可以调用。
封装
get/set方法:不写__init__()方法
set_name(self,new_name):
self.name=new_name
get_name(self):
return self.name
案例:
class Student:
    def set_name(self,name):
        self.name=name
    def get_name(self):
        return self.name
stu=Student()
stu.set_name("abc")
print(stu.get_name())


公有方法:
私有方法:def __test():只能在当前类中使用,以__开头
自动销毁方法:
__del__():
 XXX
当对象没有引用的时候,或程序结束的时候,程序自动调用__del__()
del 引用
可演示删除时自动调用__del__()
程序结束时自动调用__del__()



面向对象的三大特征:封装、继承、多态
继承:子类继承父类,子类可以使用父类的属性和方法,简化代码.
当生成子类对象时,先初始化父类对象,所以如果父类有__init__()方法,并且有属性时,要通过子类的构造赋值
一个类可以有多个子类
在子类中,调用父类的属性时,在__init__()方法中使用
父类.属性,或self.属性或父类.__init__(self,参数)或super(父类,self).__init__(参数)四种方法给父类传参
调用父类方法时:super().父类方法()



父类()
子类(父类)
三代继承:子类初始化方法需要祖父、父类及自己的属性,可以调用父类的初始化方法传参,可以重写父类的方法
构造的顺序依然先构造祖父类,再构造父类,最后构造自己
类继承object
方法重写:
如果子类重写的方法想调用父类的方法时,在子类方法中:父类.方法(self)或super().父类方法()
私有属性、私有方法:均不能在类外面被调用
多继承:类同时继承多个父类,class C(A,B),当有AB均有相同方法,而子类又重写时,调用谁的方法,如果子类没有方法,则调用哪个父类的方法?
类名.mro(),可以看到所有父类,即搜索顺序




猜你喜欢

转载自blog.csdn.net/qq_38929454/article/details/80517988