python基础-第三篇-函数编程

基本数据类型之set

  • set是无序不允许重复的集合
  • set创建:s = set() 创建空集合  s = {11,22,33}
  • 转换s = set(可迭代数据)
li = [11,22,33,44]
s = set(li)
print(s)  #结果为{33, 11, 44, 22}
  • 集合元素的添加与清空
se = {11,22,33}
se.add(44)
print(se)  #结果为{33, 11, 44, 22}
se.clear()
print(se)  #结果为set()
  • set_name1.difference(set_name2) 找到name1中存在,name2不存在的元素组成新的集合
se = {11,22,33}
be = {33,55}
ret1 = se.difference(be)
ret2 = be.difference(se)
print(ret1)  #结果为{11, 22}
print(ret2)  #结果为{55}
  • set_name1.difference_update(set_name2) 找到name1中存在,name2不存在的元素组成的集合更新给自己
se = {11,22,33}
be = {33,55}
se.difference_update(be)
print(se)  #{11, 22}
  • set_name1.isdisjoint(set_name2) name1和name2无交集返回Ture,有交集就返回False
se = {11,22,33}
be = {33,55}
ret = se.isdisjoint(be)
print(ret)  #结果为False
  • set_name1.issubset(set_name2)   name1是否为name2的子序列
  • set_name1.issuperset(set_name2)  name1是否为name2的父序列
s1 = {11,22,33,44,55}
s2 = {11,22}
ret = s2.issubset(s1)  #s2是s1的子序列吗?
print(ret)  #结果为True
ret1 = s1.issuperset(s2)  #s1是s2的父序列吗?
print(ret1)  #结果为True
  • set_name1.symmetric_difference(set_name2)  把两集合相同的元素剔除,用剩下的元素组成新的集合
  • set_name1.symmetric_difference_update(set_name2)  把两集合相同的元素剔除,用剩下的元素组成的集合赋给name1
se = {11,22,33,44}
be = {11,22,77,55}
ret = se.symmetric_difference(be)
print(ret)  #结果为{33, 44, 77, 55}
se.symmetric_difference_update(be)
print(se)  #结果为{33, 44, 77, 55}
  • set_name.discard(元素项)和set_name.remove(元素项)  都是移除,不过remove移除不存在的元素会报错
se = {11,22,33,44}
se.discard(44)
print(se) #结果为{33, 11, 22}
se.remove(22)
print(se) #结果为{33, 11}
se.discard(44)
# se.remove(44) #报错
  • set_name1.intersection(set_name2) 求两集合的交集
se = {11,22,33,44}
be = {11,22,77,55}
ret = se.intersection(be)
print(ret)  #结果为{11, 22}
  • set_name1.union(set_name2) 求两集合的并集,为新的集合
se = {11,22,33,44}
be = {11,22,77,55}
ret = se.union(be)
print(ret)  #结果为{33, 11, 44, 77, 22, 55}
  • set_name.pop() 不需要参数,随机删除一个
se = {11,22,33,44,4,4,5,1,5,2,8,4,9,6,5,65,2,5,2,58,2,58,2,8,52,8,6,654,487,4}
for i in range(10):ret = se.pop()print(ret)print(se,type(se))
  • set_name1.update(set_name2) 取并集并附给name1
se = {11,22,33,44}
be = {11,22,77,55}
se.update(be)
print(se) #结果为{33, 11, 44, 77, 22, 55}

 

三元运算

  • 格式:name = 值1 if 条件 else 值2
  • 条件成立,就值1赋给name,否则把值2赋给name
  • 可以这么说三元运算就是条件语句的简化版
name = 12 if 2>3 else 25
print(name)  #结果为25
name = 12 if 1==1 else 25
print(name)  #结果为12

 

不同数据类型在内存的存址方式

  • str(字符串) 一次性创建,不能修改,如果要修改必须重新创建

   

  • list(列表) 存址方式为链表形式,元素之间记住了上一个元素的位置,下一个元素的位置

   

 

深浅拷贝

  • 对于 数字 和 字符串 而言,赋值、浅拷贝和深拷贝无意义,因为其永远指向同一个内存地址
import copy
str1 = 'alex'
str2 = str1  #赋值
str3 = copy.copy(str1)  #浅拷贝
str4 = copy.deepcopy(str1)  #深拷贝
print(id(str1),id(str2),id(str3),id(str4))
#结果为8373168 8373168 8373168 8373168
import copy
num1 = 1234
num2 = num1  #赋值
num3 = copy.copy(num1)  #浅拷贝
num4 = copy.deepcopy(num1)  #深拷贝
print(id(num1),id(num2),id(num3),id(num4))
#结果为1331088 1331088 1331088 1331088
  • 对于字典、元祖、列表 而言,进行赋值、浅拷贝和深拷贝时,其内存地址的变化是不同的
import copy
dict1 = {"k1": "wu", "k2": 123, "k3": ["alex", 456]}
dict2 = dict1  #赋值
dict3 = copy.copy(dict1)
dict4 = copy.deepcopy(dict1)
print(id(dict1),id(dict2),id(dict3),id(dict4))
#结果为10077192 10077192 10505160 10464264

  看到这结果,我们可以得出,赋值对于字典而言,其内存地址是没有发生变化的,但是对浅拷贝和深拷贝的话,其内存地址都改变了,你可能会想,浅拷贝和深拷贝有啥区别了?

  • 浅拷贝只拷贝第一层,深拷贝除了最后一层不拷贝,其他的都拷贝

浅拷贝:

import copy
dict1 = {"k1": "wu", "k2": 123, "k3": {'偶像':'景女神','人生格言':['景女神是最棒的','我们都是最棒的']}}
dict2 = copy.copy(dict1)  #浅拷贝
# dict2['k1'] = 'jingliyang'  #在第一层,dict1没有跟着dict2变化
# print(dict1)  #结果为{'k1': 'wu', 'k2': 123, 'k3': {'偶像': '景女神', '人生格言': ['景女神是最棒的', '我们都是最棒的']}}
# print(dict2)  #结果为{'k1': 'jingliyang', 'k2': 123, 'k3': {'偶像': '景女神', '人生格言': ['景女神是最棒的', '我们都是最棒的']}}

dict2['k3']['人生格言'] = '每天很美好'  #看到没,在第二层,dict1贱贱的跟着dict2变化了
print(dict1)  #结果为{'k2': 123, 'k3': {'人生格言': '每天很美好', '偶像': '景女神'}, 'k1': 'wu'}
print(dict2)  #结果为{'k2': 123, 'k3': {'人生格言': '每天很美好', '偶像': '景女神'}, 'k1': 'wu'}

 

附图:

深拷贝:

import copy
dict1 = {"k1": "wu", "k2": 123, "k3": {'偶像':'景女神','人生格言':['景女神是最棒的','我们都是最棒的']}}
dict2 = copy.deepcopy(dict1)  #深拷贝
# dict2['k1'] = '景丽洋'   #在这里改变第一层,dict1没有跟着dict2变化
# print(dict1)  #{'k3': {'人生格言': ['景女神是最棒的', '我们都是最棒的'], '偶像': '景女神'}, 'k1': 'wu', 'k2': 123}
# print(dict2)  #{'k1': '景丽洋', 'k3': {'人生格言': ['景女神是最棒的', '我们都是最棒的'], '偶像': '景女神'}, 'k2': 123}

dict2['k3']['人生格言'] = '景女神,加油!'  #你看,第二层dict1还是没有跟着dict2变化
print(dict1)  #{'k3': {'偶像': '景女神', '人生格言': ['景女神是最棒的', '我们都是最棒的']}, 'k1': 'wu', 'k2': 123}
print(dict2)  #{'k3': {'偶像': '景女神', '人生格言': '景女神,加油!'}, 'k1': 'wu', 'k2': 123}

附图:

 

函数

  • 函数是面向过程编程,也叫函数式编程
  • 当程序运行时,解释器从上往下解释,遇定义函数时先读取到内存,但不执行
  • 执行 --函数名()
  • 语法结构:
def function_name(args):功能块return 返回值
  • return后面是返回值,不写return,默认返回None,返回值是可以用变量接收的
  • 在函数中,执行了return,函数后面的代码就不执行了

  为了理解更透彻,让我们先看一个例子:

def add(x,y):z = x + yreturn zdef main():a = 12b = 13c = add(a,b)print(c)main()
print('End!')

  首先这个例子中定义两个函数,分别为add和main两个函数,add函数有两个形式参数x和y,而main函数无形参也无返回值,在执行main函数的过程中又去调用了add函数

  发送邮件实例

复制代码import smtplib
from email.mime.text import MIMEText
from email.utils import formataddrmsg = MIMEText('邮件内容', 'plain', 'utf-8')
msg['From'] = formataddr(["武沛齐",'wptawy@126.com'])
msg['To'] = formataddr(["走人",'424662508@qq.com'])
msg['Subject'] = "主题"server = smtplib.SMTP("smtp.126.com", 25)
server.login("wptawy@126.com", "邮箱密码")
server.sendmail('wptawy@126.com', ['424662508@qq.com',], msg.as_string())
server.quit()
View Code

 

  局部变量和全局变量

  • 局部变量,从字面上的意思理解就是肯定是生活在某个局部地方的,好!那在这里,定义在函数体内的变量叫做局部变量
  • 全局变量,定义在函数体外的变量叫做全局变量
  • 局部变量只可被本函数使用,全局变量可以被所有的语句访问使用
  • 由于局部变量定义在函数体内,故多个函数可以在各自函数体内使用相同的变量名作为自己的变量

  看例子,我会找茬

def f1():x = 12print(x)def f2():y = 13print(y)def f3():print(x)print(y)def main():f1()f2()f3()main()
print('End!')

  是不是发现了错误呢?这就是函数内部调用其他的函数里的局部变量的错误

  • 全局变量没有定义在任何函数体内,如果在某个函数里修改某个全局变量,必须用global声明一下这个变量是全局的才能修改
def printlocalx():x = 12print('f1 local x =',x)def printlocaly():y = 13print('f2 local y =',y)def readglobal():print('f3 read global x =',x)print('f3 read global y =',y)def modifyglobal():global xprint('f4 write x = -1')x = -1def main():printlocalx()printlocaly()readglobal()modifyglobal()x = 200
y = 100
main()
print('after modified global x =',x)
print('End')
结果为:f1 local x = 12f2 local y = 13f3 read global x = 200f3 read global y = 100f4 write x = -1after modified global x = -1End
  •  为了规范起见,全局变量建议用大写,局部变量用小写

 

  形参和实参

  • 在定义函数时的变量称作函数的形参,作为外部值传入函数的接口
  • 函数调用时的变量称作实参
def multi(x,y):    #定义时的x,y就是形参z = x * yreturn zdef main():a = 12b = 13c = multi(a,b)  #调用时的a,b就是实参print(c) main()
print('End')

   

  位置参数和关键词参数

  • 按照函数定义时的位置顺序传入值的方式称作位置参数传入
  • 按照函数定义时的关键词对应关系传入值的方式称作关键词参数传入,这个也是老师说的指定参数
#梯形面积公式
def trapezoid_area(base_up,base_down,height):return 1/2*(base_up+base_down)*height
print(trapezoid_area(1,2,3))   #这种传入参数的方式被称作位置参数传入
result = trapezoid_area(base_up=1,base_down=2,height=3)    
#这种传入参数的方式称为关键词参数传入
print(result)

 

  默认参数

  • 默认参数就是在函数定义时给某个参数设定默认值,默认参数必须在普通参数之后
  • 默认参数在不给其传值时,使用默认值,给值就是修改默认值
def trapezoid_area(base_up,base_down,height=3):return 1/2*(base_up+base_down)*height
result1 = trapezoid_area(1,2)   #传入两个参数也可,也可修改三参,即默认参数
print(result1)

  你不知道的小秘密,你常用的print居然是一个既熟悉又陌生的人儿

print('   *','  ***',' *****','   |',sep='\n')

  sep为print函数的默认参数,默认值为空格,传入的\n为换行

 

  动态参数

  • def func(*args) 接受多个参数,内部自动构造元组
def f1(*a):print(a,type(a))f1(123)  #结果为(123,) <class 'tuple'>#多传几个
f1(11,22,33)  #结果为(11, 22, 33) <class 'tuple'>

  你看,在定义函数的时候给参数前加了*,然后调用函数时输出的结果为元组,那如果传了列表呢?

def f1(*a):print(a,type(a))li = [11,22,33]
f1(li)  #结果为([11, 22, 33],) <class 'tuple'>

  结果是把列表当整体作为元素的元素了,那如果我们就是想要把列表的每个元素作为构造元组的元素呢?

def f1(*a):print(a,type(a))li = [11,22,33]
f1(*li)  #结果为(11, 22, 33) <class 'tuple'>

  其实只要在执行函数时传入的参数前加*就可以了

 

  • def func(**kwargs) 接收多个参数,内部自动构造字典
def f2(**b):print(b,type(b))f2(a1 = 123)  #结果为{'a1': 123} <class 'dict'>

  好,如果要给其传入字典,而且也是要把每个键值对用于构造的字典的键值对,应该怎么做呢?相信很多人都想到了在前面加**吧?

def f2(**b):print(b,type(b))dict1 = {'k1':'景女神','k2':'景女神是最棒的'}
f2(**dict1)  #结果为{'k2': '景女神是最棒的', 'k1': '景女神'} <class 'dict'>

  另外,告诉你,如果传入字典,你不加**,是会报错的

 

  • def func(*args,**kwargs):接受多个参数,既可以自动构造元组,又可以自动构造字典,而且一个*的必须在两个*的前面
def f3(*args,**kwargs):print(args,type(args))print(kwargs,type(kwargs))f3(11,22,33,k1=123,k2=456)
结果为:(11, 22, 33) <class 'tuple'>{'k1': 123, 'k2': 456} <class 'dict'>

  你看程序能自动识别构造元素和字典,这样就可以实现给函数传入多个参数了

 

                                                        欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                             笔者:拍省先生   

转载于:https://www.cnblogs.com/xinsiwei18/p/5517936.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/395901.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

10个 Linux/Unix下 Bash 和 KSH shell 的作业控制实例

Linux 和 Unix 属于多任务的操作系统&#xff0c;也就是说一个系统在同一时间段内能运行多重任务(进程)。在这个新的博客系列&#xff0c;我将会列出相关的 Linux 和 Unix 作业&#xff08;job&#xff09;控制的命令&#xff0c;你可以通过这些命令在 Bash 或 Korn 还有 POSIX…

微信小程序 - 骨架屏

骨架屏 - “与其等待网络加载&#xff0c;不如提前给点暗示” 注&#xff1a;不适用复杂交互效果 演示 示例解释以及使用全在index.wxml中&#xff0c;观看需了解组件使用. 示例下载&#xff1a;微信小程序-骨架屏演示 转载于:https://www.cnblogs.com/cisum/p/10032448.html

ajax拼接显示不同样式,Ajax重点整理

Ajax工作流程Ajax:在不刷新页面的情况下向服务器请求数据1.创建XMLHttpRequest对象(俗称小黄人)var xhr new XMLHttpRequest();XMLHttpRequest &#xff1a; http请求对象&#xff0c;负责实现ajax技术2.设置请求xhr.open(get, url);url:服务器地址3.发送请求xhr.send();4.注册…

java与mysql的交互_java与数据库交互常用到的一些方法

下面我整理了一下java中常用的几个与数据库交互的常用方法&#xff0c;仅供参考&#xff1a;1.执行SQL(dao层的实现类中)(1)SQL查询&#xff1a;//import org.hibernate.Query;//import org.hibernate.Session;/*** 通过名称查找id*parampsname*returnid*/OverridepublicString…

网站 服务器 用sqlite,sqlite服务器数据库

sqlite服务器数据库 内容精选换一换简要介绍SQLite是一款轻量级的关系型数据库&#xff0c;它的运算速度非常快&#xff0c;占用资源很少&#xff0c;不仅支持标准的SQL语法&#xff0c;还遵循了数据库的ACID事务。编写语言&#xff1a;C一句话概述&#xff1a;轻量级的关系型数…

type-c接口图片_TypeC接口除了充电还能干吗?这些功能都不知道,简直是在浪费...

Type C手机接口相信每个使用智能手机的朋友都很熟悉&#xff0c;目前已经广泛使用在智能手机领域&#xff0c;并且得到用户一致好评。但是对于Type C接口真正的用处很少有人知道&#xff0c;大部分用户只了解正反面都可充电&#xff0c;其他方面一概不知&#xff0c;对于这一点…

Zookeeper的api的简单使用(转载)

转载自: http://www.cnblogs.com/sunddenly/p/4031881.html 1.API 2.API 示例 ZooKeeper中的组成员关系 理解ZooKeeper的一种方法就是将其看作一个具有高可用性的文件系统。但这个文件系统中没有文件和目录&#xff0c;而是统一使用“节点”(node)的概念&#xff0c;称为znode…

1.1好素数

题目 题意&#xff1a;一个好素数的定义是&#xff0c;他是一个素数&#xff0c;然后他的左右两边10区间内存在素数&#xff0c;那么他就是好素数&#xff0c;现在让你输入一个数字&#xff0c;这个数字以内的好素数的数量。 解题方法&#xff1a;先把每一个数字是不是素数判断…

python 矩阵获取行数_4个最佳项目创意的代码片段和示例,旨在为Python和机器学习构建出色的简历!...

点击上方“小白学视觉”&#xff0c;选择加"星标"或“置顶”重磅干货&#xff0c;第一时间送达一篇文章带你了解4个最佳项目创意的代码片段和示例Python是一种特殊的编程语言&#xff0c;适用于从初学者到中级用户。由于它的灵活性&#xff0c;它正逐渐成为一种非常流…

Android 多状态加载布局的开发 Tips

2019独角兽企业重金招聘Python工程师标准>>> 什么是多状态 Layout 对于大多数 App 而言&#xff0c;项目中都有多状态加载 View 这种需求&#xff0c;如下图所示。 对应到开发中&#xff0c;我们通常会开发一个对应的自定义 layout 用于根据页面不同的状态来显示不同…

iis mysql5.7_手动配置网站环境 IIS 10+PHP 7.1+MySQL 5.7

之前配置环境一直用的一键安装包&#xff0c;不管是phpStudy还是lnmp&#xff0c;昨天尝试在自己电脑配置一下iis的环境&#xff0c;也踩了一些坑&#xff0c;整理了一下。测试电脑是Windows10&#xff0c;理论上Win7和IIS7.5都支持的。安装 IIS1&#xff1a;控制面板 > 程序…

node webkit(nw.js) 设置自动更新

原理&#xff1a;把更新的文件放在服务器上&#xff0c;设置一个客户端版本号&#xff0c;每次打开客户端的时候&#xff0c;通过接口获取服务器上的版本&#xff0c;如果高于本地的版本就下载服务器上的代码&#xff0c;低于或等于就不更新 1 <script>2 var htt…

mysql8.0版1130_navicat premium连接mysql 8.0报错error 10061和error1130问题

昨天安装了最新版的mysql navicat premium, 但没来得及测试使用Navicat连接。今天上班时&#xff0c;使用Navicat premium连接mysql时&#xff0c;出现报错ERROR 2003 (HY000): Can’t connect to MySQL server on ‘1XX.XX.XX.XX’ (10061).起初以为是mysql没有安装成功&#…

Java挂起线程

2019独角兽企业重金招聘Python工程师标准>>> 不优雅的suspend import java.util.concurrent.TimeUnit;public class SuspendTest {static Object lock new Object();SuppressWarnings("deprecation")public static void main(String[] args) {Suspend s1…

华为p4用鸿蒙系统吗_华为p40pro是鸿蒙系统吗

华为的鸿蒙OS是一款“面向未来”的操作系统&#xff0c;一款基于微内核的面向全场景的分布式操作系统&#xff0c;此前mate30系列并没有搭载鸿蒙系统。那华为p40pro是鸿蒙系统吗&#xff1f;品牌型号&#xff1a;华为p40pro华为p40pro是鸿蒙系统吗&#xff1f;华为p40pro没有搭…

Web优化 --利用css sprites降低图片请求

sprites是鬼怪&#xff0c;小妖精&#xff0c;调皮鬼的意思&#xff0c;初听这个高端洋气的名字我被震慑住了&#xff0c;一步步掀开其面纱后发觉非常easy的东西。作用却非常大 什么是CSS Sprites CSS Sprites是指把网页中非常多小图片&#xff08;非常多图标文件&#xff09;做…

mysql取消mvvc机制_MySQL探秘(六):InnoDB一致性非锁定读

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(MVVC)读取当前数据库中行数据的方式。如果读取的行正在执行DELETE或UPDATE操作&#xff0c;这时读取操作不会因此去等待行上锁的释放。相反地&#xff0c;InnoDB会去读取行的一个快照。上图直观地…

APP应用 HTTP/1.0中keep-alive

在HTTP/1.0中keep-alive不是标准协议&#xff0c;客户端必须发送Connection:Keep-Alive来激活keep-alive连接。https://www.imooc.com/article/31231HTTP协议是无状态的协议&#xff0c;即每一次请求都是互相独立的。因此它的最初实现是&#xff0c;每一个http请求都会打开一个…

安装mysql8._安装MySQL8(附详细图文)

安装MySQL8(附详细图文)删除mysql服务&#xff1a;mysqld -remove mysql1、下载 mysql 8下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/2、配置 mysql 配置文件打开 mysql 8 的安装目录&#xff1a;my.ini注意设置自己对应的 mysql 安装目录 和数据存放目录[mysq…

win10安装windows live writer 错误:OnCatalogResult:0x80190194

到官网下载了一个在线安装程序&#xff0c;可是一运行就提示无法安装&#xff0c;显式错误“OnCatalogResult:0x80190194”&#xff0c;如下图所示 找到windows live安装程序的安装日志文件。具体位置是&#xff1a;C:\Users\All Users\Microsoft\WLSetup\Logs 需要下载安装文件…