Python-全局变量和局部变量&函数&递归&深浅拷贝

1.全局变量和局部变量python

money = 10 # 全局变量 def func(): num = 'num' # 局部变量 global money money += 500 print(num + money) ''' global money # 在局部变量中想修改全局变量,须要用global声明你要修改的是全局变量 全局列表、字典、集合在修改时,不用声明全局变量,能够直接修改 全局int、str、tuple(元组)在修改时,须要先声明为全局变量 便可变类型的全局变量在修改时,不用声明全局变量,能够直接修改;不可变类型,须要声明(元组元素不能修改) '''

 

2.函数定义mysql

def test1(): # 定义一个函数 pass # 表示没有函数体,直接过 def test2(a, b): # 定义一个有参的函数 return a # 函数返回值

 

3.函数参数sql

# 一、必填参数(位置参数) def say_word(word): print(word)
# 二、默认值参数:能够不传参数,不传参数的时候使用默认值,传了参数时使用所传参数 # (使用默认值参数能够实现一个函数实现多个功能,例如一个函数实现读和写两个功能) def say_hello(word='hello'): # 默认值参数 print(word)
# 三、参数组(可变参数):不限制参数的类型和数量 def send_mail(*args): # 此时args是元组类型,名称可改(例如:*name),习惯上使用args for name in args: print('给%s发邮件' % name) return args send_mail() send_mail('zhangsan') send_mail('zhangsan', 'lisi', 'wangwu')
# 四、关键字传参:形参较多时,可使用关键字传参,参数能够不用按照顺序传参 ''' 调用参数时,能够所有使用位置参数,位置一一对应,必须按照位置传参 也能够所有使用关键字传参,指定关键字,就不须要按照顺序传参 也能够位置参数和关键字参数一块儿使用,但要先写位置参数在用关键字参数,关键字参数后面不能再使用位置参数 ''' def szz(name, age, sex, addr, phone): print('111') szz(sex='man', name='zhangsan', addr='beijing', age=18, phone='13565243526') # 使用关键字参数 szz('zhangsan', 18, sex='man', addr='beijing', phone='13565243526') # 位置参数和关键字参数混合使用 # 以下,是否传参不限制,参数类型和数量不限制,可是只能使用关键字参数,不能使用位置参数 def name(**kwargs): # 关键字传参,此时kwargs是字典类型,名称可改(例如:**name),习惯上使用kwargs print(kwargs) name() name(name='zhangsan', age='18', phone='1234') name(name='zhangsan', age='18', phone='1234', addr='beijing')
# 指定参数类型 def add_user(username: str, passwd: int): # 指定传入参数类型,传入参数时,也能够不传入指定类型  username.strip() print(passwd)
# 参数练习1: def student(name, age=None, *args, **kwargs): print(name) # 位置参数 print(age) # 默认参数 print(args) # 参数组 print(kwargs) # 关键字参数  student('zhangsan', 18, 'lisi', 'wangwu', sex='man', phone='123')
# 参数练习2: def db_mysql(host, port, user, passwd, db): print(host) print(port) print(user) print(passwd) print(db) db_info1 = ('127.0.0.1', 3306, 'root', '1234567', 'szz') db_info2 = { 'host': '127.0.0.1', 'port': 3306, 'user': 'root', 'passwd': '1234567', 'db': 'szz', } db_mysql(*db_info1) db_mysql(**db_info2) # * 表明拆开db_info1(解包),将db_info1中的元素与参数意义对应,但db_info1中的元素不能多于参数数量,且位置需与参数位置对应 # db_info1只要是有下标的数据类型便可,例如列表,元组,字符串等 # ** 表明拆开db_info2字典(解包),将db_info2中的元素与参数意义对应,但db_info2中的元素不能多于参数数量,且key的位置需与参数位置对应

 

4.函数返回值数组

# return的做用:1.返回函数值 2.结束函数 # 返回多个值,用一个变量接收,那么会将多个返回值放入一个元组中进行返回 def get_file(age, name, addr): age += 5 name = 'szz' + name addr = 'beijing' + addr return age, name, addr res = get_file(19, 'xiaohei', 'chaoyang') # 多个返回值使用一个变量接收 age, name, addr = get_file(19, 'xiaohei', 'chaoyang') # 多个返回值使用多个变量接收 print(res) # 打印出的会是一个元组

 

5.递归函数

# 递归:函数本身调用本身,最大次数调用999次 def say(): num = input('请输入一个数字:').strip() if int(num) % 2 != 0: print('请输入一个偶数') say() say()
# 练习: li = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9] for i in li: if i % 2 != 0: li.remove(i) print(li) # 结果为:[1, 2, 4, 6, 8] # 缘由是,循环删除列表元素时,再次循环,列表元素会更新 # 解决方法以下: l1 = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9] l2 = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9] # 不能写成l2=l1,由于变量存储时是存的内存地址,l2=l1时,l1和l2内存地址相同 # 写法2:l2 = l1[:] for i in l2: if i % 2 != 0: l1.remove(i) print(l1) print(id(l1)) print(id(l2)) # 查看内存地址

 

6.深拷贝和浅拷贝spa

# 深拷贝 l1 = [1, 1, 2, 3, 4, 5, 6, 7, 8, 9] l2 = l1[:] # 开辟了新的内存空间,两个变量之间互不影响 # 浅拷贝 l2 = l1 # 未开辟新的内存空间,两个变量之间会被互相影响 # 深拷贝和浅拷贝的区别,浅拷贝不会开辟新的内存空间,深拷贝会开辟新的内存空间 import copy # 导入copy模块 d = {'name': 'zhangsan', 'age': [12, 1, 14]} d1 = d # 浅拷贝 d2 = copy.deepcopy(d) # 深拷贝函数 d3 = copy.copy(d) # 浅拷贝,可是d和d3的内存地址不一样,但若d中存在多层(例如列表元素),则不会拷贝深层的内容

 

7.内置函数code

input() # 输入 tuple() # 元组 bool # 布尔 dict() # 字典 list() # 列表 len() # 求长度 sum([1, 2, 3]) # 求和 max([1, 2, 3]) # 求最大值 min([1, 2, 3]) # 求最小值 round(1.98234, 2) # 取几位小数(将1.98234保留两位小数) divmod(10, 5) # 取商和余数 globals() # 用于全局时,取当前文件中的全部变量;用于局部时,依然取当前文件的全部变量 locals() # 用于全局时,取当前文件中的全部变量;用于局部时,取局部的全部变量 chr(55) # 将ascii转成对应的字符 ord('A') # 将字符转成对应的ascii dir(d) # 查看d中有哪些方法
# 排序 sorted(l) # 对l进行排序,l能够是list、字符串等,排序后会返回一个list,升序 sorted(l, reverse=True) # 降序排序 # 执行python代码 code = ''' print('1') ''' exec(code) # 运行python代码 eval(code) # 执行简单的python代码 # 枚举 enumerate l = [1, 2, 3, 4, 5] for id, i in enumerate(l, 1): # 将l列表中的元素从1开始,自动编号 print('%s=>%s' % (id, i))
# 压缩 zip() # 压缩,将多个列表合在一块儿;不限制于列表,对字典使用时,只合并两个字典的key值;若一列表元素多余另外一元素,则以少的为准 list1 = ['xiaoming', 'xiaobai', 'xiaohei', 'zhangsan'] list2 = [1, 2, 3, 4, 5] l1 = {'name': 1, 'age': 2} l2 = {'add': 3, 'phone': 4} res = list(zip(l1, l2)) res1 = list(zip(list1, list2)) print(res) print(res1) # 循环调用 import os list(map(os.mkdir, ['1', '2', '3'])) # 循环调用函数,获取函数返回结果;表示循环列表中的值调用os.mkdir函数,注意函数不加括号,后面只要是能够循环的便可 # map(os.mkdir,['1','2','3'])直接这样写不会调用即不会真的执行,需强转  score = [89, 43, 60, 52, 45, 37, 66, 100, 21, 24] def is_jg(s): if s > 59: return True result = list(filter(is_jg, score)) # 循环调用函数,将返回True的保存,不然过滤
相关文章
相关标签/搜索