2019年04月22日
1.变量进阶
-
可变类型和不可变类型
不可变类型:数字类型,字符串,元组
可变类型:列表和字典
2.接受函数返回数据(元组)
直接对元组中的内容进行操作即可,不方便。还有其他方法:希望单独操作可以使用多个变量进行接受,第一个元组内容给a第二个给b,注意元组中变量个数需要和接受的数量一致。
a, b = measure()
3.函数参数进阶
def demo(num, num_list): # 函数内部修改参数不会影响实参内容
print("inner biock")
num = 10
num_list = [1, 2, 3]
print(num_list)
print(num)
glob = 100
giob_list = [4, 5, 5]
demo(glob, giob_list)
print(glob)
print(giob_list)
inner biock
[1, 2, 3]
10
100
[4, 5, 5]
可变类型通过方法修改形参会影响实参的值
def demo(num_list): # 函数内部修改参数不会影响实参内容
print("inner biock")
num = 10
num_list.append(9)
num_list = [1, 2, 3, 4]
print(num_list)
giob_list = [4, 5, 5]
demo(giob_list)
print(giob_list)
inner biock
[1, 2, 3, 4]
[4, 5, 5, 9]
4.列表相加并非内容相加而是做列表整合
a = [1, 2]
b = [3, 4]
print(a + b)
[1, 2, 3, 4]
5.函数缺省参数
可以从下面的例子体会缺省参数的含义,通过参数值的设定简化函数调用。本例中revest的值默认值是false
gl_list = [6, 3, 9]
gl_list.sort() # 升序排序
print(gl_list)
gl_list.sort(reverse=True) # 降序排序
print(gl_list)
以下为一个函数缺省的实例:
def print_info(name, gender = True):
gender_text = "男生"
if not gender:
gender_text = "女生"
print("%s 是 %s" %(name, gender_text))
print_info("小明")
print_info("小美", False)
小明 是 男生
小美 是 女生
注意事项:缺省参数应该处于末尾位置(右边),没有缺省的应该位于函数最左边
6.多值参数
当开发时传递参数不确定可以使用多值参数,多用于网络大牛开发的框架
*args接受元组
**kwargs接受字典
def demo(num, *nums, **persons):
print(num)
print(nums)
print(persons)
demo(1, 2, 3, 4, 5, name = "xiaoming", age = "18")
1
(2, 3, 4, 5)
{'name': 'xiaoming', 'age': '18'}
观察下面两段代码
def sun_numbers(args):
num = 0
print(args)
for n in args:
num = num + n
return num
result = sun_numbers((1, 2, 3, 4, 5))
print(result)
def sun_numbers(*args):
num = 0
print(args)
for n in args:
num = num + n
return num
result = sun_numbers(1, 2, 3, 4, 5)
print(result)
E:\pro\07_语法进阶\venv\Scripts\python.exe E:/pro/07_语法进阶/hm_17_多值参数求和.py
(1, 2, 3, 4, 5)
15
备注:使用*使得调用更为简单
7.元组和字典的拆包
def demo(*args, **kwargs):
print(args)
print(kwargs)
gl_nums = (1, 2, 3)
gl_dict = {"name": "xiaoming", "age": 18}
demo(gl_nums, gl_dict) # 均被传递给args所以需要拆包
demo(*gl_nums, **gl_dict) # 拆包语法成功
demo(1, 2, 3, name="xiaoming", age=18) #其他方法
运行结果
((1, 2, 3), {'name': 'xiaoming', 'ade': 18})
{}
(1, 2, 3)
{'name': 'xiaoming', 'ade': 18}
(1, 2, 3)
{'name': 'xiaoming', 'age': 18}
8.函数的递归
实质:求解递归问题,代码复用,自己调用自己,最重要的就是递归出口
实例:递归求和
def sum_number(num):
# 1.递归出口
if num == 1:
return 1
# 2.数字累加
# 假设sun_number能够正确处理1.。。。。num—1
temp = sum_number(num - 1)
return temp + num
result = sum_number(100)
print(result)
9.面向对象 (OOP)
- 面向过程:顺序执行,只有执行,没有返回值,特点是侧重怎么做,就是在主程序中调用不同的函数,注重步骤和过程,不负责责任分工,不适合复杂项目的开发。,不适合新需求的增加
- 面向对象:侧重于做事情的主体(谁来做)面向对象是更大的封装,封装内容为方法。即不同对象封装不同方法完成不同功能,很适合于大型和复杂项目的开发。
- 核心概念:类和对象,类是抽象的不能直接使用,其使命就是用来创造对象,对象是类的实例化。在程序开发中,现有类,再有对象。类只需要有一个,对象有多个,不同对象之间属性可能各不相同。类中有什么样的属性和方法,对象就有什么样的属性和方法。
- 类的设计:(1)需求分析(==类名,属性和方法==且满足大驼峰命名法),特征描述为属性,行为描述为方法
- 一个内置函数dir:在dir中传入标识符/数据可查看所有属性和方法,方法名为python提供的内置方法/属性
>>> s = [1,2]
>>> s
[1, 2]
>>> dir(s)
['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']
>>>
- 定义简单的类(只包含方法):
# 需求:小猫爱吃鱼,小猫爱喝水
class Cat:
def eat(self):
print("小猫爱吃鱼儿")
def drink(self):
print("小猫爱喝水")
# 实例化对象
tom = Cat()
tom.eat()
tom.drink()
- 面向对象中的应用:使用print输出对象变量默认情况下,能够输出这个变量引用的对象是由哪一个类创建的以及在内存中的地址(以十六进制的形式表示)
print(tom)
<__main__.Cat object at 0x000001CEDA2B2B70>