Python基础2——类型转换、深浅拷贝、函数

8、类型转换、深浅拷贝

8.1 数据转换

数据类型

  • int 整型 float浮点数 bool 布尔值 complex复数
  • str 字符串
  • list 列表
  • tuple 元组
  • dict 字典
  • set 集合
1# 类型转换 2int() 3num = int("123") 4if num == 123: 5 print("等于123") 6 7num = 123 8n = str(num) #转换为字符串 9print(type(n)) 10 11 12# eval() 用来执行一个字符串表达式,并返回表达式的值 13res = eval("10+10") 14print(res) #得到20 15res = eval("[1,2,3]") 16print(type(res)) # 转换为list 17 18 19b = list("abc") 20c = tuple(b) #转换为元组 21print(c) 22 23 24op = {} #这是字典 25print(type(op)) # <class 'dict'> 26 27 28op2 = set() #集合类型 29op2 = set("abcdefg") #集合类型 30print(type(op2)) #集合 31 32 33# 转换为字典 34li = ["name","age"] 35value = ["zhangsan",18] 36dic = dict(zip(li,value)) 37 38 39li = [('name','zs'),('age',18)] 40dic = dict(li) 41

8.2 浅拷贝

前言:数据赋值

1 2li = [1,2,3] 3li2 = li 4li.append(4) 5print(li2) #对li修改,li2也跟着修改

浅拷贝(数据半共享):会创建新对象,拷贝第一层的数据,嵌套层会指向原来的内存地址

外部不同,但是内部是相同的

1import copy 2a = [1,2,[3,4]] # [3,4] 指的是嵌套层 3b = copy.copy(a) 4print(a,id(a)) #通过id来查看变量a的地址 5print(b,id(a)) 6# a和b是不同的。 7a.append(5) 8print(a) #[1,2,[3,4],5] 9print(b) #[1,2,[3,4]] 10 11a[2].append(5) # 给嵌套列表中插入数据 12print(a) # [1,2,[3,4,5],5] 13print(b) # [1,2,[3,4,5]] 14 15

8.3 深拷贝

深拷贝:数据完全不共享,a和b完全独立

1import copy 2a = [1,2,[3,4]] 3b = copy.deepcopy(a) 4 5print(a) 6print(b) 7 8b.append(5) 9print(a) # [1,2,[3,4],5] 10print(b) # [1,2,[3,4]] 11 12a[2].append(5) 13print(a) # [1,2,[3,4,5],5] 14print(b) # [1,2,[3,4]] 15

8.4 可变对象与不可变对象

可变对象:存储的对象可以被修改

常见的可变类型:

  1. 列表 list
  2. 字典 dict
  3. 集合 set

不可变对象

  1. int
  2. bool
  3. float
  4. complex
  5. str 字符串
  6. tuple 元组
1# 不可变对象 2# 不可以修改,修改相当于重新给一个值 3n = 10 4print(n) 5print(id(n)) #查看内存地址 6n += 1 7print(id(n)) # 内存地址不一样 8 9 10st = "hello" 11print(id(st)) #查看内存地址 12st = st + 'python' 13print(id(st)) #内存地址不同 14 15 16tu = (1,2,3) 17print(id(tu)) 18
1# 可变 list/dict/set 2# 变量对应的值可以修改,但是内存地址保持不变 3 4li = ['上九天揽月','床前明月光'] 5print(id(li)) 6li.append('张三') 7print0(id(li)) #两个内存地址不会改变 8 9 10dic = {"name":"张三","age":18} 11print(dic) 12print(id(dic)) 13dic["name"] = "吃花椒" 14print(id(dic)) 15 16

9 函数基础

9.1 函数

函数的定义:

1def 函数名(): 2 函数体 3 4

9.2 函数的返回值

return 给函数的调用者返回值,函数中遇到return,此函数不再继续执行

9.3 函数的参数

函数的参数有必选参数、默认参数、可变参数、关键字参数

  • 必选参数: 写几个就传几个 def funa(a,b)
  • 默认参数: def funa(a=12)
  • 可变参数: 将实参所有的位置参数接收,放在一个元组里 def funa(* args)
  • 关键字参数: 接受所有的关键字参数,将其转换为一个字典。 def funa(**kwargs)

9.4 函数的嵌套

1def funa(): 2 def funb(): 3 print("这是内部函数") 4 funb() 5 6funa()

可变参数

1 2def fun(a,b,*c,d=5): 3 print(a) 4 print(b) 5 print(c) 6 print(d) 7 8fun(1,2,3,4,7) 9 10# 输出结果 11# 1 12# 2 13# (3,4,7) 14# 5 15 16 17 18
1 2def fun1(a,b): 3 return a+b 4 5fun1(*(1,2)) 6# 返回3 7fun1(*[1,2]) 8# 返回3 9fun1(*{1,2}) 10# 返回3

10 函数进阶

1.定义函数def 返回值return 2.函数参数,预备参数,默认参数,可变参数 3.函数嵌套 在一个函数中调用一个函数,在一个函数中定义一个函数

10.1 作用域

10.1.1 作用域的概念

​ 局部变量

只在函数内部有作用

​ 从定义位置开始到函数定义结束位置有效

​ 全局变量

​ 函数外部定义的变量整个范围有效

1price = 2 2 3def st1(): 4 print(f"全局变量{price}") 5def st2(): 6 print(f"全局变量{price}") 7 8# 输出结果 9# 2 10# 2
1price = 2 2 3def st1(): 4 print(price) 5 6def st2(): 7 price=1.2 8 print(price) 9print(price) 10st1() 11st2() 12print(price) 13 14#输出结果 152 162 171.2 182 19 20# 因为函数内部用变量,现在里面找,里面找不到再到外面找

全局变量和局部变量相同

1a = 100 2def funa(): 3 a = 200 #局部变量 4 print(a) 5# 输出结果 6200 7 8# 当局部变量和全局变量相同的时候,优先使用局部变量

10.1.2 global

如何修改全局变量

global 将变量提升为全局变量

global 将会修改全局变量

1global 将变量名声明为全局变量 2 3a = 100 4def funa(): 5 global a 6 print(a) 7 a = 200 8print(a) 9 10## 输出结果为 11## 200 12## 200 13

global name 将局部变量name变成了全局变量

1def speak(): 2 global name ,num 3 name = "jiuge" 4 print(name) 5 6def work(): 7 print(num) 8 9speak() 10print(name) 11

10.1.3 nonlocal

nonlocal 外层函数的局部变量,只能在嵌套函数中使用

  • 使用与global类似

  • 将变量声明为外层变量(外层函数的局部变量,而且不能是全局变量)

1 2def out_fun(): 3 num = 10 4 def inner_fun(): 5 nonlocal num 6 num = 20 7 inner_fun() 8 print(num) 9 10out_fun() 11 12# 输出结果 13# 20
1 2def out_fun(): 3 a = 10 4 def inner1(): 5 a = 5 6 def inner2(): 7 nonlocal a 8 a = 20 9 print(a) 10 inner2() #调用函数 11 print(a) 12 inner1() 13 print(a) 14 15#输出结果 16# 20 17# 20 18# 10

10.2 匿名函数

​ 语法: 函数名 = lambda 形参:返回值

​ lambda是定义匿名函数的关键字,相当于函数的def

​ 调用: 结果 = 函数名(实参)

1 2def funa(a,b): 3 return a+b 4funa(1,2) 5 6# 等价于 7res = lambda a,b : a+b 8res(1,2) 9
1 2n1 = 5 3n2 = 8 4 5# 如果if条件为真,就打印为print(n1) 6print(n1) if n1 < n2 else print(n2) #三目运算符 7 8we = lambda n1,n2: "正确" if n1<n2 else "错误" 9print(we(1,2))

10.3 内置函数

10.3.1 max,min,range方法

比如说max,min,range等系统自带的内置函数

1#查看所有的内置函数 2import builtins 3print(dir(builtins)) 4
1 2abs(17) #返回绝对值 3sum([1,2,3]) #求和 4min 5zip 6

10.3.2 zip函数

1a = [1,2,3] 2b = [4,5,6,5] 3for i in zip(a,b): 4 print(i) 5 6# 输出结果 7# (1,4) 8# (2,5) 9# (3,6)

10.3.3 reduce函数

1## reduce方法 2 3# 求和 4from functools import reduce 5res = reduce(lambda x,y : x+y , [1,2,3,4,5]) 6 7# 求积 8from functools import reduce 9res = reduce(lambda x,y:x*y , [1,2,3,4,5]) 10 11#求阶乘 求5! 12from functools import reduce 13res = reduce(lambda x,y:x*y , range(1,6))

10.3.4 map函数

1 2# ============ 3l = [1,2,3] 4def funa(x) 5 return x+3 6mp = map(funa,l) #依次作用到列表中的每个元素上,保存到新的list之中 7print(list(mp)) 8# 返回结果 [4,5,6] 9# =================== 10 11 12# 通过map给每个元素开平方 13res = map(lambda x : x*x , [1,2,3,4,5]) 14res = list(res) 15#得到结果 16#[1,4,9,16,25] 17 18 19

10.4 拆包

1 2# 拆包 3li = [1,2,3,5] 4a,*b = li 5 6print(a) 7print(b) 8# 输出结果 9# 1 10# [2,3,5] 11 12# ====================== 13 14# ======================= 15tu = (1,2,3,4) 16a,b,c,d = tu 17print(a,b,c,d) 18# 输出结果 19# 1,2,3,4 20 21#===================== 22 23a,*b,c = [1,2,3,4,5] 24print(a) 25print(b) 26print(c) 27# 输出结果 28# 1 29# [2,3,4] 30# 5 31 32*a,b = [1,2,3] 33print(a) 34print(b) 35# 输出结果 36# [1,2] 37# 3
1l = {"姓名":1, "名称":2} 2*a,b = l 3print(a) 4print(b) 5# 输出结果 6# ['姓名'] 7# 名称 8 9

10.5 递归函数

概念:一个函数在内部不调用其他的函数,而是调用本身

自己调用我自己

递归函数的要点

  1. 必须要有一个明确的结束条件
  2. 每进行更深一层的递归时,问题规模相比上次都要有所减少
  3. 相邻两次重复之间有紧密的联系
1# 计算1-20的累加和 2 3def add(): 4 s = 0 5 for i in range(1,21): 6 s += i 7 print(s) 8 9 10def funa(n): 11 if n==1: 12 return 1 13 else: 14 return n + funa(n-1) 15print(funa(5))
1#求斐波那契数列 2 3 4def fib(n): 5 if n==2 or n==1: 6 return 1 7 else: 8 return fib(n-1)+fib(n-2) 9 10print(fib(5))

10.6 闭包

在嵌套函数的前提下,内部函数使用了外部函数的变量,而且外部函数返回了内部函数

我们就把使用了外部函数变量的内部函数称为闭包

构成条件

  1. 函数中嵌套了一个函数
  2. 内存函数使用了外层函数的变量
  3. 外层函数的返回值是内层函数的函数名
1def outer(): #外部函数 2 n = 10 3 def inner(): #内部函数 4 print(n) #内部函数用到了外部函数的变量 5 6 return inner 7 8ot = outer() #这是一个函数 9ot() #调用函数
1 2def test(): 3 print("打印test") 4 5t = test 6t() #相当于调用了test函数 7 8
1def outer(m): 2 3 def inner(n): 4 return m+n 5 return inner 6 7inn = outer(5) 8inn(6) 9 10# 返回结果 11# 11 12 13# 第二种方法 14outer(5)(6) 15
点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

java将前端的json数组字符串转换为列表

记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang

Python3:sqlalchemy对mysql数据库操作,非sql语句

Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''