python(6)

140 阅读6分钟

函数

函数的定义及调用

image.png

自定义函数

def get_sum(num):#num形式参数
    s=0
    for i in range(1,num+1): 
        s+=i
    print(f'1到{num}之间的累加和为:{s}')
#函数的调用
get_sum(10)# 1-10之问的累加和     10是实际参数值
get_sum(100)# 1-100之间的累加和   100是实际参数值
get_sum(1000)#1-1000之间的累加和  1000是实际参数值

image.png

image.png

函数的参数传递

image.png

image.png

1.位置参数

def happy_birthday(name,age):
    print('祝'+name+'生日快乐')
    print(str(age)+'生日快乐')
#正确的调用方式
happy_birthday('小明',18)

2.关键字参数

def happy_birthday(name,age):
    print('祝'+name+'生日快乐')
    print(str(age)+'生日快乐')
#正确的调用方式(1)关键字
happy_birthday(age=18,name='小明')
#(2)位置+关键字
happy_birthday('小明',age=18)

注:位置参数在前,关键字参数在后 所以happy_birthday(name='小明',18)报错

3.默认值参数

def happy_birthday(name='小明',age=18):#默认值参数的定义
    print('祝'+name+'生日快乐')
    print(str(age)+'生日快乐')
#正确的调用方式(1)
happy_birthday()#不用传参
#(2)位置传参
happy_birthday('小明')
#(3)关键字传参
happy_birthday(age=19)#name采用默认值

当位置参数和关键字参数同时存在的时候,应当遵循 位置参数在前,默认值参数在后

4.可变参数

image.png

在调用时,前加星号会进行系列解包操作

函数的返回值

image.png

变量的作用域

image.png

匿名函数lambda

image.png

#只有一句的函数
def calc(a,b):
    return a+b
print(calc(10,20))
#匿名函数
s=lambda a,b:a+b
print(type(s))
print(s(10,20)

还可以用于成绩排序:

student_scores=[
    {'name':'john','score':87},
    {'name':'irene','score':95},
    {'name':'lily','score':80},
    {'name':'winter','score':100}
]
student_scores.sort(key=lambda x:x.get('score'),reverse=True)
print(student_scores)

递归函数

image.png

斐波那契数列

image.png

def fac(n):
    if n==1 or n==2:
        return 1
    else:
        return fac(n-1)+fac(n-2)
print(fac(9)) #34

常用的内置函数

数据类型转换函数

image.png

常用的数学函数

image.png

注: int('3.14')这种写法在转整型里是不合法的(在字符串中写浮点数)

常用的迭代器函数

image.png

常用的其他内置函数

image.png

注:format,数值默认右对齐,字符串默认左对齐

print(format(3.14,'20')) #数值默认右对齐
print(format('hello','20')) #字符串默认左对齐
print(format('hello','*<20'))#<左对齐,*表示填充符,20表示显示的宽度
print(format('hello','*^20'))

print(format(3.1415926,'.2f'))#保留两位小数

实战一

image.png

import random
def get_max(lst):
    max=lst[0]
    for i in range(1,len(lst)):
        if max<lst[i]:
            max=lst[i]
    return max
lst=[random.randint(1,100) for i in range(10)]#列表生成式
print(lst)
print(get_max(lst))

实战二

image.png

def get_digit(x):
    s=0
    lst=[]
    for item in x:
        if item.isdigit():
            lst.append(int(item))
    s=sum(lst)
    return lst,s
s=input('请输入一个字符串:')
lst,x=get_digit(s) #系列解包赋值
print('提取的数字列表为:',lst)
print('累加和为:',x)

实战三

image.png

def lower_upper(x):
    lst=[]
    for item in x:
        if 'A'<=item<='Z':
            lst.append(chr(ord(item)+32))#ord()将字母转为Unicode值,加上32,chr()整数转成字符
        elif 'a'<=item<='z':
            lst.append(chr(ord(item)-32))
        else:
            lst.append(item)
    return ''.join(lst)
s=input('请输入一个字符串:')
print(lower_upper(s))

实战四

image.png

def get_find(s,lst):
      for item in lst:
          if s==item:
              return True
      return False
lst=['hello','world','python']
s=input('请输入你要判断的字符串:')
result=get_find(s,lst)
print('存在' if result else '不存在') # if--else的简写,三目条件运算符

面向对象程序设计

面向过程和面向对象思想的异同

image.png

类和对象

  • 类: 是由n多个对象中抽取像的属性和行为从而归纳出来的
  • 在Python中一切皆对象
  1. 自定义数据类型的语法结构:
class 类名():
    pass

但是你自定义完之后,目前还是不可以使用,它相当于你绘制了一个图纸,只有你创建对象之后才可以使用,对象是具体的实例

  1. 创建对象的语法结构
对象名=类名()
对象名也就是一个变量名

类的组成

image.png

创建和调用

class Student:
    #类属性:直接定义在类中,方法外的变量
    school='扬州教育中心'

    # 初始化方法,实例属性需要定义在_init_方法中,使用self打点的变量
    def __init__(self,xm,age):
        self.name=xm #左侧是实例属性,xm是局部变量,将局部变量的值xm赋值给实例属性self.name
        self.age=age #实例的名称和局部变量的名称可以相同

    #定义在类中的函数,称为方法,且自带参数self
    def show(self):
        print(f'我叫:{self.name},今年{self.age}岁了')

    #静态方法
    @staticmethod
    def sm():
        #self.name()
        #self.show()
        print('这是一个静态方法,不能调用实例属性,也不能调用实例方法')

    #类方法
    @classmethod
    def cm(cls):
        print('这是一个静态方法,不能调用实例属性,也不能调用实例方法')

#创建类对象
stu=Student('phy',18)
#类属性(直接使用类名去打点调用)
print(Student.school)
#实例属性(它使用对象名进行打点调用,而并不是用self)
print(stu.name,stu.age)
#实例方法(使用对象名进行打点调用)
stu.show()
#静态方法(直接使用类名打点调用)
Student.sm()
#类方法(直接使用类名打点调用)
Student.cm()

动态绑定属性和方法

  • 每个对象的属性名称相同,但属性值不同
  • 可以为某个对象绑定独有的属性或方法

动态绑定属性

image.png

动态绑定方法

image.png

面向对象的三大特征(封装,继承,多态)

image.png

1.封装

python中的权限控制

image.png 如果非要访问双下划线的私有属性或方法的话

对象的名字._类的名字_ _属性名

对象的名字._类的名字_ _方法名()


关于属性设置问题:(私有属性)

class Student:
    def __init__(self,name,gender):
        self.name=name
        self.__gender=gender#私有

    #让@property修饰方法,来把方法修改(转)为一个属性去使用
    #虽然这样私有属性就可以显示了,但是它只可读不可写
    #如果非要写,就需要setter
    @property
    def gender(self):
        return self.__gender

    #将我们gender这个属性设置为可写属性
    @gender.setter
    def gender(self,value):
        if value!='男' and value!='女':
            print('性别有误,已将性别默认值为男')
            self.__gender='男'#设置默认值
        else:
            self.__gender=value

stu=Student('zyx','女')
print(stu.name,'的性别是',stu.gender)

#改
stu.gender='其它'
print(stu.name,'的性别是',stu.gender)

2.继承

image.png

(1) 一个父类可以有多个子类

image.png

(2) 一个子类可以继承多个父类(多继承)

image.png

方法重写

image.png

即:在子类里再写一个方法,方法名要跟你要重写的这个父类的方法名相同

当然你也可以完全重写,不使用super调用父类内容

比如:

image.png

3.多态

image.png

object类(对象)

对象的特殊方法(首尾双下划线)

image.png

dir()内置函数,可以查看你的类的对象,它所具有的属性或方法

image.png

a=10
b=20
print(dir(a)) # Python巾一切皆对象
print(a+b) #执行加法运算
print(a.__add__(b))
print(a.__sub__(b))#执行减法运算
print(f'{a}<{b}吗? ',a.__lt__(b))
print(f'{a}<={b}吗? ',a.__le__(b))
print(f'{a}=={b}吗? ',a.__eq__
(b))print( ' -'*40)

print(f'{a}>{b}吗? ',a._gt__(b))
print(f'{a}>={b}吗? ',a._-ge__(b))
print(f'{a} !={b}吗? ',a.__ne__(b))

对象的特殊属性(首尾双下划线)

image.png