函数,作用域,递归,类

函数内部可以访问全局变量,但是不能直接修改全局变量
全局变量使用场景
1.计数器
2.共享变量
def fun01():
#内部函数要去修改全局变量需要使用关键字global  定义
     global a
     a+=1
     print(a)
fun01(3)
print(a)
嵌套函数内部函数可以直接访问外部变量,但不能直接修改
def outer():
     x=10
     def inner():
          y=20
          #内部函数要去修改外部变量需要使用关键字nonlocal  定义
          nonlocal x
          x+=y
     inner()
     print(x)
outer()

def conunt_outer():
     count=0
     count2=1
     count2+=1

     def counter():
          nonlocal count
          count+=1
          return count,count2
     return counter
counter=conunt_outer()
print(counter())
print(counter())
print(counter())
print(counter())
print(counter())


实现阶乘

1.迭代实现
num=int(input("输入数字"))
def fun(n):
    result=1
    for i in range(1,n+1):
        result=result*i
    return result
print(fun(num))

2.递归
def fun1(n):
    if n==1:
        return 1
    else:
        return n*fun1(n-1)
print(fun1(6))
类:描述对象的工具
self 作用可以理解为c/c++中的this指针
self在__init__函数之前还有__new__方法(创建实例的)~
~创建实例后,给到__init__,在__init__用self表示实例
实例创建后不知道自己有哪些属性,在__init__方法中给实例什么属性,那么该实例就有哪些属性
如果不构建该实例,则会默认构造一个无参函数
class Dog():
    pass
class Person():
    def __init__(self,name,age):
        self.name =name
        self.age = age
    定义类的行为(函数)
    def say_hello(self):
        print(f"{self.name}要吃饭!!!!!!!!!!!")
person=Person("老子",18)
person.say_hello()
dog=Dog()
print(id(dog))

动态添加类实例的实例属性
运行对象实例化后,在运行阶段动态添加和修改实例属性
实例属性是实例化对象后的属性,属于实例的,而非属于对象
person2=Person("张三",30)
print(person2.name)
person2.name='zhangsan'
person2.address='chengdu'
print(person2.name)
print(person2.address)

class Dog():
    def __init__(self,name,age,sex):
        self.name =name
        self.age = age
        self.sex = sex
    def say(self):
        print("调用犬吠")
dog1=Dog("旺财",2,1)
print(dog1.name)
print(dog1.age)
print(dog1.sex)
dog1.say()

类属性:定义在__init__方法外,属于类的属性
调用
1.通过类名.属性名
2.通过实例名.属性名
作用:可以定义一些公共属性
class Person:
    count = 0
    def __init__(self,name):
        self.name = name
p1=Person('zhangsan')
print("通过实例打印",p1.count)
print("通过类打印",Person.count)

类方法:类方法是用于描述类的行为的方法,类方法属于类,不属于该类创建的对象
1. 类方法需要使用@classmethod装饰器定义
2. 类方法至少有一个形参,第一个形参用于绑定类,约定写为'cls'
3. 类和该类的实例都可以调用类方法
4. 类方法不能访问此类创建的实例属性
class Animal:
    clor ='black'
    @classmethod
    def set_clor(cls,clor):
        cls.clor=clor
    @classmethod
    def get_clor(cls):
        return cls.clor
1.通过类调用类方法
print(Animal.get_clor())
Animal.set_clor('yellow')
print(Animal.get_clor())
2.通过实例调用类方法
a1=Animal()
print(a1.get_clor())
a1.set_clor('red')
print(a1.get_clor())

class MyClass:
    #定义类属性
    class_attr=0
    #定义实例方法,初始化实例属性
    def __init__(self,value):
        self.instance_attr = value
    定义类方法,初始化类属性
    @classmethod
    def set_instance(cls,value):
        try:
            尝试使用类方法使用实例属性,会报错
            cls.instance_attr = value
        except Exception as e:
            print(e)

    定义实例方法
    def show(self):
        print(self.instance_attr)
        print(self.class_attr)
myclass=MyClass(10)
myclass.show()
myclass.set_instance_attr(30)
myclass.show()
MyClass.set_instance(20)
print(MyClass.class_attr)

静态方法:是定义在类的内部函数,此函数的作用域是类的内部
1.静态方法需要使用@staticmethod装饰器定义
2.静态方法与普通函数定义相同,不需要传入self实例参数和cls类参数
3.静态方法只能凭借该类或类创建的实例调用
4.静态方法可以访问类属性但是不能访问实例属性
作用:实现一些公共方法,跟类和实例没有关系
class Myclass:
    class_value=0
    def __init__(self,value):
        self.instance=value
    @staticmethod
    def my_add(a,b):
        return a+b
    #实例方法不能直接调用静态方法,只能通过类或则实例对象调用
    # def instance_add(self,a,b):
    #     return my_add(a,b)

    def instance_add(self):
        m1=Myclass(1)
        print(m1.my_add(1,2))



#通过类调用静态方法
result=Myclass.my_add(1,2)
print(result)
#通过实例对象调用静态方法
myclass=Myclass(10)
result=myclass.my_add(1,2)
print(result)
myclass.instance_add()

魔术方法
class MyClass:
    def __init__(self,value):
        self.instance_value = value
    #定义字符串显示形式
    def __str__(self):
        return f'实例属性值{self.instance_value}'
myclass = MyClass(10)
print(myclass)




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值