-
编程是当下非常受人喜欢的行业,也是很多人都比较重视的行业,毕竟发展前景好、薪资待遇高。对于编程行业来说,前端开发和Python是非常热门的,那么这两者之间该如何选择呢?让很多人都产生疑问,今天为大家说说吧。 首先,无论是Python还是前端开发这两者都有大量的人才需求,拥有较为广阔的发展空间,至于该如何选择?我认为需要根据自身的知识结构、发展规模以及兴趣多方面进行考虑,综合挑选适合自己的。 对于Python语言,如果以后想要从事研发级别程序员发展路线,可以考虑从Python学习。现在IT行业中,大数据、物联网、人工智能领域是当下十分热门的,Python在这些领域具有非常重要的作用,比如数据分析、大数据领域,Python使用十分普遍。还有就是机器学习、计算机视觉以及自然语言处理方面,Python的应用也是比较广泛的。而且随着社会发展,人工智能的盛行,Python将成为更重要的编程原因。 前端开发适合哪些人?对于计算机基础知识或者数学知识较弱的人,可以选择前端开发。随着人工智能慢慢盛行,前端开发也有着非常不错的前景,赋予更多含义,除了传统的前端开发之外,还出现了很多的新职位。 综合情况来说,两者主要涉及的发展方向有所差异,具体选择哪方面,可以根据自身情况来决定,选择适合自己的领域。文章来源: blog.51cto.com,作者:老男孩IT,版权归原作者所有,如需转载,请联系作者。原文链接:https://blog.51cto.com/14596632/2507206
-
理论知识之进程的并行与并发并行 : 并行是指两者同时执行,比如赛跑,两个人都在不停的往前跑;(资源够用,比如三个线程,四核的CPU )并发 : 并发是指资源有限的情况下,两者交替轮流使用资源,比如一段路(单核CPU资源)同时只能过一个人,A走一段后,让给B,B用完继续给A ,交替使用,目的是提高效率。区别:并行是从微观上,也就是在一个精确的时间片刻,有不同的程序在执行,这就要求必须有多个处理器。并发是从宏观上,在一个时间段上可以看出是同时执行的,比如一个服务器同时处理多个session。
-
类如何定义? 使用class关键字进行定义 class 关键字之后是一个空格,接下来是类的名称 类名的首字母一般要大写# 定义一个关于车的类 class Car(object): def info(self): print("this is a car")1234如何实例化对象? 使用=号实例化对象 通过 对象名.成员 的方式访问其中的成员数据或成员方法# 实例化对象 car = Car() # 调用对象方法 car.info()123456运行结果this is a car1如何测试一个对象是否属于某个类的实例# 测试car对象是否属于Car类的实例 print(isinstance(car,Car))12运行结果True1pass是什么? pass关键字表示是一个空语句 pass关键字的作用是用来占位,使程序正常运行# 定义一个关于车的类 class Car(object): def info(self): print("this is a car") class Fly(object): pass # 实例化对象 car = Car() # 调用对象方法 car.info()12345678910111213运行结果this is a car
-
方法一:使用三引号>>> str1 = '''Le vent se lève, il faut tenter de vivre. 起风了,唯有努力生存。 (纵有疾风起,人生不言弃。)'''>>> str1 'Le vent se lève, il faut tenter de vivre. \n起风了,唯有努力生存。\n(纵有疾风起,人生不言弃。)' >>> print(str1)Le vent se lève, il faut tenter de vivre. 起风了,唯有努力生存。 (纵有疾风起,人生不言弃。)123456789101112方法二:使用反斜杠(高版本python可能会不支持此方式,且每次都要在行最后加上续行符,不够简洁)>>> str2 = 'Le vent se lève, il faut tenter de vivre. \ 起风了,唯有努力生存。\ (纵有疾风起,人生不言弃。)'>>> str2'Le vent se lève, il faut tenter de vivre. 起风了,唯有努力生存。(纵有疾风起,人生不言弃。)'123456方法三:使用小括号>>> str3 = ('Le vent se lève, il faut tenter de vivre.''起风了,唯有努力生存。''(纵有疾风起,人生不言弃。)')>>> str3'Le vent se lève, il faut tenter de vivre.起风了,唯有努力生存。(纵有疾风起,人生不言弃。)'123456
-
大体思路需要写两个类:Node类:用于创建结点,并将结点以(人类)能看懂的字符串形式输出,而不是显示内存地址LinkedList类:用于将各结点连成链表,并实现对链表进行操作的一些方法代码创建Node类:class Node: def __init__(self, data, next=None): self.data = data # 数据,当前结点的元素 self.next = None # 指针,指向下一个结点 def __repr__(self): # 把结点表示为一个字符串 return "NodeValue({})".format(self.data)1234567调用测试:n = Node(1)print(n) # 因为写了__repr__方法,所以输出的是Node(1),而不是内存地址12创建LinkedList类:准备工作:初始化方法 & 打印字符串方法想要达到的输出效果类似于:NodeValue(1) --> NodeValue(3) --> NodeValue(4) --> ENDclass LinkedList: def __init__(self): self.head = None # 初始化头结点 ## 打印链表 def __repr__(self): cursor = self.head string_repr = "" while cursor: string_repr += f"{cursor} --> " cursor = cursor.next return string_repr + "END"123456789101112「查」:方法1. is_empty() 判断链表是否为空 def is_empty(self): return self.head == None122. length() 返回链表长度 def length(self): if self.head is None: return 0 cursor = self.head count = 0 while cursor: count += 1 cursor = cursor.next return count1234567893. exist(data) 判断结点是否存在 def exist(self, data): """ :return: True or False :rtype: Boolean """ cursor = self.head while cursor: if cursor.data == data: return True else: cursor = cursor.next return False1234567891011124. travel() 遍历整个链表 def travel(self): if self.head is None: return None cursor = self.head while cursor: print(cursor) cursor = cursor.next12345675. getitem(index) 根据索引,得到链表中该位置的值 def getitem(self, index): current = self.head if current is None: raise IndexError("This is an empty linked list.") for i in range(1, index): # 目标超过链表范围 if current.next is None: raise IndexError("Index out of range") current = current.next return current123456789106. search(data) 返回该结点出现的左数第一个的位置,不存在返回-1 def search(self, data): if self.exist(data) == False: return -1 else: cursor = self.head count = 0 while cursor: count += 1 if cursor.data == data: return count else: cursor = cursor.next123456789101112「增」:方法7. insert_head(data) 在链表头部添加元素 def insert_head(self, data): new_node = Node(data) # 创建一个新结点 if self.head: # 如果已存在头部结点 # 让新创建的结点的next指向原本的头结点 # 也就是说,新结点成为了原本的头结点的上一个结点 new_node.next = self.head self.head = new_node # 重置头结点12345678. append(data) 在链表尾部添加元素 def append(self, data): if self.head is None: # 如果链表目前为空,则在头结点添加该元素 self.insert_head(data) else: cursor = self.head while cursor.next: # 遍历链表 cursor = cursor.next # 创建一个新结点添加到链表尾部 cursor.next = Node(data)123456789109. insert(pos, data) 在链表中的指定位置添加元素 def insert(self, pos, data): """ :param pos: 要插入结点的位置,从0开始。 pos > 0,代表是从左开始数的位置 pos = 0,代表在头部添加 pos < 0,代表是从右开始数的位置,倒数从-1开始 也就是说 链表长度 + 倒数下标 = 正数下标 :type pos: int :param data: 要插入的结点值 :type data: int """ if pos > 0: if self.head is None: # 如果链表目前为空,则在头结点添加该元素 self.insert_head(data) else: new_node = Node(data) # 创建一个新结点 # 通过循环,得到新结点的上一个结点 pre = self.head count = 0 while count < (pos-1): count += 1 pre = pre.next # 让新结点指向原本该位置的结点 new_node.next = pre.next # 让上一个结点指向新结点 pre.next = new_node elif pos == 0: self.insert_head(data) elif pos < 0: if self.head is None: # 如果链表目前为空,则在头结点添加该元素 self.insert_head(data) else: new_node = Node(data) # 通过循环,得到新结点正数顺序的上一个结点 leftpos = self.length() + pos pre = self.head count = 0 while count < (leftpos - 1): count += 1 pre = pre.next # 让新结点指向原本该位置的结点 new_node.next = pre.next # 让上一个结点指向新结点 pre.next = new_node1234567891011121314151617181920212223242526272829303132333435363738394041424344454647「删」:方法10. delete_head() 删除头结点 def delete_head(self): temp = self.head if self.head: self.head = temp.next temp.next = None1234511. delete_tail() 删除尾结点 cursor = self.head if self.head: if self.head.next is None: self.head = None else: while cursor.next.next: cursor = cursor.next cursor.next, cursor = None, cursor.next elif self.head == None: return "This is an empty linked list."1234567891012. remove(data) 删除结点,若存在值相等的结点,仅删除左起第一个 def remove(self, data): """ :return: 返回删除结点后的链表;若传入的数据在链表中不存在,则返回原链表 """ if self.exist(data) == False: return self else: pre = self.head cursor = pre.next count = 0 while cursor: if cursor.data == data: # 删除,也就是让该结点的上一结点直接连到该结点的下一结点 pre.next = cursor.next cursor.next = None return self else: pre = pre.next cursor = cursor.next1234567891011121314151617181913. removeall(data) 删除结点,若存在值相等的结点,删除所有 def removeall(self, data): """ :return: 返回删除结点后的链表;若传入的数据在链表中不存在,则返回原链表 """ while self.exist(data): self.remove(data) return self1234567「改」:方法14. setitem(index, data) 根据索引,为链表中该位置的值重新赋值 def setitem(self, index, data): current = self.head if current is None: raise IndexError("This is an empty linked list.") for i in range(1, index): # 目标超过链表范围 if current.next is None: raise IndexError("Index out of range") current = current.next current.data = data12345678910其他方法15. linklist(object) 传入对象,一次性将序列中的所有元素构建成一个链表 def linklist(self, object): self.head = Node(object[0]) temp = self.head for i in object[1:]: node = Node(i) # 将上一个结点指向下一个结点 temp.next = node temp = temp.next
-
-
TCP传输的关键是得有socket(套接字),所以代码里面要用到socket的模块实现原理所需要的环境,一台windows电脑,一个linux虚拟机,linux虚拟机下写好相关python代码,windows下安装网络调试助手此时选自己的windows电脑为服务端,linux虚拟机为客户端py代码如下:import socketif __name__ == '__main__': # 首先创建好客户端的套接字socket,这个是socket模块下的一个类,其中第一个参数是ipv4协议的意思,第二个参数是选择了TCP协议 tcp_client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 此段代码代表这个客户端与服务端进行连接,其中8080是服务端开启的端口(我所用的服务端为windows电脑) tcp_client_socket.connect(("192.168.99.1", 8080)) # 下面写好准备发送的数据,因为TCP协议是以字节流的形式发送,所以要用encode方法去编译代码 send_data = "hello python".encode("utf-8") # 发送数据 tcp_client_socket.send(send_data) # 养成良好习惯,发完数据后关闭套接字 tcp_client_socket.close()1234567891011121314运行完代码后,我们可以在windows电脑下的网络调试助手下看见:说明我们发送成功,服务端已经收到了客户端发来的请求
-
Tornado是一个支持异步的Web框架,通过使用非阻塞I/O流,它可以支撑成千上万的开放连接,效率非常高,本节就来介绍一下它的安装方式。1. 相关链接GitHub:https://github.com/tornadoweb/tornadoPyPI:https://pypi.python.org/pypi/tornado官方文档:http://www.tornadoweb.org2. pip安装这里推荐使用pip安装,相关命令如下:pip3 install tornado执行完毕后,即可完成安装。3. 验证安装同样,这里也可以用一个Hello World程序测试一下,代码如下:import tornado.ioloopimport tornado.webclass MainHandler(tornado.web.RequestHandler): def get(self): self.write("Hello, world")def make_app(): return tornado.web.Application([ (r"/", MainHandler), ])if __name__ == "__main__": app = make_app() app.listen(8888) tornado.ioloop.IOLoop.current().start()直接运行程序,可以发现系统在8888端口运行了Web服务,控制台没有输出内容,此时访问http://127.0.0.1:8888/,可以观察到网页中呈现了Hello,world,如图1-42所示,这就说明Tornado成功安装了。图1-42 运行结果4.结语后面,我们会利用Tornado+Redis来搭建一个ADSL拨号代理池。
-
新买了一张床上学时候就听过一个梗,说某公司新入职的员工每人发一个睡袋,为了能让员工在通宵加班的时候,能小憩一会儿。当时年少无知的我以为是个笑话,谁知道如今把自己活到了笑话之中。陪了我两年的公司午休床坏了,然后甄选半天,才找了一个中意的下单。谁知道买回来的床就问题。这床吧,一睡上去就起不来啊…几次想退货,但怕老板打我都忍了下来,自己默默承受吧。哈哈…Python模块晚上和朋友聊天,说到公司要求精兵计划,全员都要有编程能力。然后C、Java、Python…对于零基础入门的,当然是选择Python的人较多了。可朋友说他只是看了简单的语法,可python有那么多的模块,连名字都不知道,该怎么学啊!针对python模块获取,告诉大家几个方法…通常大家在安装完成python后,都知道python自带了一个通过tkinter编写的IDLE工具,但除了IDLE还有什么呢?当然少不了文档喽…我们点击左下角的开始菜单,在搜索栏中输入python,结果如下:第一个是python命令行工具,相当于在windows命令行中输入python后的效果。第二个就是python自带的IDLE图形化编程工具第三个呢?看这个图标就知道是一个chm格式的文档工具。它在什么路径呢?Python家目录下的Doc文件夹内大家可以看到里面内容还是比较全的…第四个呢?一个网页版的python文档说明如何使用命令启动呢?python -m pydoc -p xxxx我们可以指定端口号启动。除了这些,有其他的么?当然…help命令,我们通过help(‘modules’)可以看到所有已安装的模块,之后通过输入具体的模块名称来访问模块说明:刚才说到了获取所有模块,那如何获取我安装的模块呢?使用pip list即可查看:有人说,这些文档都是英文的,没翻译怎么看…其实,推荐大家就这么看,别人翻译过的东西,哪里有原版的完整。当然,如果你说你英语不达标,也可以找翻译后的内容看看,当然最好看看我之前的文章:Python开发英语单词自测工具,助你逆袭单词王!,哈哈。为什么不推荐看网上的翻译或者帖子呢,因为有太多网站的内容是过时的,或者错误的!举个例子交互式输入我们在学习python时,经常遇到需要根据用户的输入内容来做下一步操纵的事情,此时我们需要用到input模块。然后网上查查,就看到铺天盖地的都在说,input使用需谨慎,会造成漏洞,窃取你的数据。很多朋友就心慌了,这还怎么使用啊!他也有解决办法: 在python2中,推荐使用raw_input()函数,尽量不要使用input()函数,在python3中,input()函数被默认改为默认输入为字符串。 哦,原来看了半天python3根本没有可能出现上面通篇文章的问题,呵呵了…如果你直接通过上面的命令看说明,哪儿需要浪费这么多时间:交互安全既然说到了input和安全,就不能不说一下关于交互输入密码的问题。当我们在使用input输入密码时,会将用户的密码通过明文打印,那怎么行…此时,我们需要更换模块,python为大家准备了一个专门用来输入密码的交互式模块 getpass要注意的是,getpass模块在命令行下使用正常,但如果是在编辑器中,则无法完美运行。命令行下使用时,会提示存在安全隐患,并且密码会明文显示用户输入的时候也无法像html的input password一样输入星号,而是毫无反应。针对以上问题该怎么处理呢?推荐大家使用:windows环境下: msvcrt模块linux环境下: termios但需要注意一点不论是什么模块,在IDE的代码编辑器下都无法正常使用,因为编辑器内不会加换行捕获为程序结束!我的电脑是windows环境的,所以为大家展示下msvcrt模块的使用:# -*- coding: utf-8 -*-# @Author : 王翔# @WeChat : King_Uranus# @公众号 : 清风Python# @Date : 2019/9/26 22:54# @Software : PyCharm# @version :Python 3.7.3# @File : InputPassword.pyimport msvcrtimport osprint("Please input your password:")chars = []while True: newChar = msvcrt.getch().decode(encoding="utf-8") if newChar in os.linesep: # 如果是换行,则输入结束 break elif newChar == '\b': if chars: del chars[-1] msvcrt.putch('\b'.encode(encoding='utf-8')) msvcrt.putch(' '.encode(encoding='utf-8')) msvcrt.putch('\b'.encode(encoding='utf-8')) else: chars.append(newChar) msvcrt.putch('*'.encode(encoding='utf-8')) # 显示为星号pwd = (''.join(chars))print("\nyour password is:{0}".format(pwd))
-
手痒痒了,虽然已经过了有奖实验的最后时间,还是去沙箱实验室跑了一个实验,嗯,怎么说呢,太坎坷了~首先是默认从北京一进入实验环境,然后数据库的购买却在北京四下面,这个还不算事~pass。然后,是数据库的建表环节(数据库建表环节,当然可以用sql直接做,可是手册是交互式的操作,担心用sql实验通不过):左侧的建表流程的第二部,只露出来一窄行,没有滚动条,也没有窗口的重置方式,那么,用户是怎么猜到屏幕下面有什么呢?凭借多年踩坑经验,多次尝试后,本人果断选择了tab键,没错,就是这个神奇的tab键,像游戏开挂了有没有?!!!!居然把藏在水下的文本框捞出来了啊~~~~否则,你这关根本过不去~正心中有点小窃喜,准备做完了显摆显摆~~实验系统开始打脸了!原来,本次实验真正的考验还没开始:xcfe的字体细如针鼻~可怜我这老花眼啊~改就一个字,这是考操作熟练度的么?!调大字体~接下来的pycharm是这个样子的。。。。这就有个悖论:字体太小需要调大字体--》首先得找到调大字体的地方--》字体太小,压根看不清楚!额,这个实验是用大屏演示通过审核的么?为什么要设置这么小的字体?为什么?为什么?究竟是为什么呀?
-
1. 装饰器的定义就是给已有函数增加额外功能的函数,它本质上就是一个闭包函数。装饰器的功能特点:不修改已有函数的源代码不修改已有函数的调用方式给已有函数增加额外的功能闭包和装饰器的区分:如果闭包函数的参数有且只有一个,并且是函数类型,那么这个闭包函数称之为装饰器。写代码要遵循开放封闭原则,它规定已经实现的功能代码不允许被修改,但可以被扩展。2. 装饰器的示例代码# 定义装饰器def decorator(func): def inner(): # 在内部函数里面对已有函数进行装饰 print('已添加登录认证') func() return innerdef comment(): print('发表评论')# 调用装饰器对已有函数进行装饰,左边的comment=innercomment = decorator(comment)# 调用方式不变comment()12345678910111213141516171819203. 装饰器的语法糖写法如果有多个函数都需要添加登录验证的功能,每次都需要编写func = decorator(func)这样代码对已有函数进行装饰,这种做法还是比较麻烦。Python给提供了一个装饰函数更加简单的写法,那就是语法糖,语法糖的书写格式是: @装饰器名字,通过语法糖的方式也可以完成对已有函数的装饰# 定义装饰器def decorator(func): def inner(): # 在内部函数里面对已有函数进行装饰 print('已添加登录认证') func() return inner @decorator # comment = decorator(comment) 装饰器语法糖对该代码进行了封装 左边comment=innerdef comment(): print('发表评论')# 调用方式不变comment()1234567891011121314151617184. 装饰器的执行时机当 当前模块加载完成以后,装饰器会立即执行,对已有函数进行装饰。# 定义装饰器def decorator(func): print('装饰器执行了') def inner(): # 在内部函数里面对已有函数进行装饰 print('已添加登录认证') func() return inner @decorator # comment = decorator(comment) 装饰器语法糖对该代码进行了封装 左边comment=innerdef comment(): print('发表评论')12345678910111213141516运行结果:装饰器执行了15. 装饰器的使用5.1 装饰器的使用场景函数执行时间的统计输出日志信息5.2 装饰器实现已有函数执行时间的统计import timedef decorator(func): def inner(): # 获取时间距离1970-1-1 0:0:1的时间差 begin = time.time() func() end = time.time() result = end - begin print(f'函数执行完成耗时:{result}') return inner @decoratordef work(): for i in range(10000): print(i)work()12345678910111213141516171819202122236. 通用装饰器的使用通用装饰器:可以装饰任意类型的函数使用装饰器装饰已有函数的时候,内部函数的类型和要装饰的已有函数的类型保持一致6.1 装饰带有参数的函数def decorator(func): def inner(num1, num2): print('正在努力执行加法计算') func(num1, num2) return inner @decoratordef add_num(num1, num2): result = num1 + num2 print(f'结果为:{result}')add_num(1, 2)123456789101112131415166.2 装饰带有参数、返回值的函数def decorator(func): def inner(num1, num2): print('正在努力执行加法计算') num = func(num1, num2) return num return inner @decoratordef add_num(num1, num2): result = num1 + num2 return result result = add_num(1, 2)print(f'结果为:{result}')1234567891011121314151617186.3 装饰带有不定长参数、返回值的函数def decorator(func): def inner(*args, **kwargs): print('正在努力执行加法计算') # *args:把元组里面的每一个元素,按照位置参数的方式进行传参 # **kwargs:把字典里面的每一个键值对,按照关键字的方式进行传参 num = func(*args, **kwargs) return num return inner @decoratordef add_num(*args, **kwargs): result = 0 for value in args: result += value for value in kwargs.values(): result += value return result result = add_num(1, 2, a=3)print(f'结果为:{result}')1234567891011121314151617181920212223247. 多个装饰器的使用多个装饰器的装饰过程:由内到外的一个装饰过程,先执行内部的装饰器,在执行外部的装饰器。def make_div(func): print('make_div装饰器执行了') def inner(): result = '<div>' + func() + '</div>' return result return innerdef make_p(func): print('make_p装饰器执行了') def inner(): result = '<p>' + func() + '</p>' return result return inner# 原理剖析:content = make_div(make_p(content))# 分布拆解:content = make_p(content),内部装饰器完成,content = make_p.inner# content = make_div(make_p.inner)@make_div @make_pdef content(): return '人生苦短,我用python'c = content()print(c)1234567891011121314151617181920212223242526272829303132make_p装饰器执行了 make_div装饰器执行了 <div><p>人生苦短,我用python</p></div>1238. 带有参数的装饰器带有参数的装饰器就是使用装饰器装饰函数的时候可以传入指定参数,语法格式: @装饰器(参数,…)使用带有参数的装饰器,其实是在装饰器外面又包裹了一个函数,使用该函数接收参数,返回是装饰器,因为 @ 符号需要配合装饰器实例使用。def return_decorator(flag): # 装饰器只能接收一个参数并且是函数类型 def decorator(func): def inner(a, b): if flag == '+': print('正在努力执行加法计算') elif flag == '-': print('正在努力执行减法计算') func(a, b) return inner # 当调用函数的时候可以返回一个装饰器decorator return decorator @return_decorator('+') # decorator = return_decorator('+'), @decorator => add_num = decorator(add_num)def add_num(a, b): result = a + b print(result)@return_decorator('-')def sub_num(a, b): result = a - b print(result)add_num(1, 2)sub_num(1, 2)12345678910111213141516171819202122232425262728293031正在努力执行加法计算 3 正在努力执行减法计算 -112349. 类装饰器的使用类装饰器:使用类装饰已有函数class MyDecorator(object): def __init__(self, func): self.__func = func # 实现__call__方法,表示对象是一个可调用对象,可以像调用函数一样进行调用 def __call__(self, *args, **kwargs): # 对已有函数进行封装 print('马上就有下班啦') self.__func()@MyDecorator # @MyDecorator => show = MyDecorator(show)def show(): print('快要下雪啦')# 执行show,就相当于执行MyDecorator类创建的实例对象,show() => 对象()show()12345678910111213141516171819马上就有下班啦 快要下雪啦
-
本贴用于答疑《DAYU数据使能实施服务伙伴赋能课程》中学员产生的问题,课程链接如下:https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXE133+Self-paced/about?isAuth=0&cfrom=hwc本贴将长期保持更新,持续答疑学员在课程实操中遇到的问题。实操资源相关问题FAQQ:打开账号之后进入对应的云服务页面显示没有权限怎么办?A:请确保区域Region选择【华南-广州】。Q:我的考试用账号里面已经有其他学员使用过/创建的库/表/资产了,这是怎么回事?A:本次实操每位学员都是拥有唯一的子账号的,若存在此情况,请联系各团队接口人,询问是否是账号分配失误或其他问题。3.2章节:《云服务资源及参数准备》FAQQ:创建不了xx资源怎么办?A:您的子账号已经开通实操所需的所有相关资源,请不要新建资源。3.2章节不需要实操。3.3章节:《RDS MySQL客户数据源模拟》FAQQ:MySQL创建导入任务时,“创建导入任务”的按钮是灰色的,无法点击。A:将导入的SQL文件后缀改为.sql小写即可。3.4章节:《DLI贴源层数据库表构造》FAQ3.5章节:《DAYU规范设计》FAQQ:在审核中心已经创建了审批人,发布指标/模型的时候没有自助审批的选项,而且发布之后一直显示待审核状态。A:审批人需要选择实操的子账号HC_DAYU_studentxxx,不要选择主账号hwstaff_lxxxxxxxx,否则将没有权限进行审批。解决办法:首先您需要添加子账号HC_DAYU_studentxxx作为审批人,然后进行二选一:1. 创建一个新的指标(例如坪效1)重新自主审批,或 2. 找华为的课程答疑接口人,让其使用主账号通过该发布请求。3.6章节:《DAYU数据开发:脚本开发》FAQQ:跨源链接超过5个,无法再创建了怎么办?A:跨源链接是可以共用的,请不要创建新的跨源链接,直接使用已有的跨源链接即可。尤其不要删除已有的跨源链接,这样会导致其他学员的脚本作业失败。Q:数据插入跨源表的脚本报错,显示The connection attempt failed怎么办?A:首先请确认是否所有操作都与视频中一致,包括右上角的数据连接/数据库/资源队列选择。若已排查所有问题,则可能是由于上一个FAQ中有其他学员删除了您所使用的的跨源链接,导致您的跨源链接失败了。此问题的解决办法:1. 换一个跨源链接(不要自己新建,使用已有的)。2. 在脚本开发中删除已有的跨源表。3. 重复脚本开发步骤,重新创建跨源表。Q:数据插入跨源表的脚本报错,显示Invalid username/password, login denied怎么办?A:请确保passwdauth字段填写“retail_auth”。该问题报错是由于我们分配的DWS账号是子账号,没有跨源链接的权限。retail_auth跨源认证使用的是DWS主账号,所以不会报错。3.7章节:《DAYU数据质量》FAQQ:在“规则管理“页面定义指标关系报错,按照课程视频中的操作写了关系表达式,却显示“关系表达式不能为空”?A:您使用的浏览器不支持这个页面,需要更换一个浏览器使用,如谷歌chrome。Q:在“新建业务场景”页面的“订阅配置”步骤中,通知没有可选的主题,怎么办?A:我们本次实操并没有开通SMN资源,“订阅配置”顶部的“通知状态”请直接关闭,不要开启。3.8章节:《DAYU数据集成:CDM云数据迁移》FAQQ:添加SK/AK时需要手机号进行验证,而考试用子账号的手机号不是我的手机号怎么办?A:我们开发了一个修改子账号手机号的脚本,下载后运行,输入子账号后三位和正确手机号即可进行修改。脚本下载地址(使用这个即可):【请点击此处下载exe】;脚本源文件下载(若不放心exe可直接看源文件,需要python环境运行):【请点击此处下载py】 。Q:下载下来的credentials.csv,里面的字段哪个是AK哪个是SK?A:Access Key是AK,Secret Key是SK。Q:在“表/文件迁移”tab中创建任务分组,显示没有配额了怎么办?A:如遇到这种情况,请使用别人创建好的分组。在您创建的任务名称后方添加 _名字 标识即可。3.9章节:《DAYU数据开发:作业开发》FAQQ:左侧节点无法拖动到中间的画布,或者拖到画布之后显示有问题,这是怎么回事?A:您使用的浏览器不支持这个页面,需要更换一个浏览器使用,如谷歌chrome。Q:贴源层及明细层作业运行失败了是怎么回事?A:可能的原因1. 请见3.8章节第三个FAQ,您是否使用成了别人的CDM作业节点?Q:集市层作业运行失败了是怎么回事?A:可能的原因1. 请见3.6章节第二个FAQ。3.10章节:《DAYU数据资产》FAQ3.11章节:《DAYU数据服务》FAQQ:发布API的时候提示重名了怎么办?A:可以在API名称后面添加属于自己的标识,例如 _公司_名字 即可。3.12章节:《DAYU数据治理实操考试》FAQQ:删除不掉schema怎么办?A:您需要先删除schema里面的表,使用drop table schema.表进行删除。
-
本文出自“Python为什么”系列,请查看全部文章关于 Python 中的pass语句,它似乎很简单(只有 4 个字母),即使是没有任何编程经验的初学者也能很快地掌握它的用法。官方文档 的介绍十分简单,下面的三个例子可以让我们快速地了解到如何使用它:简单而言,pass 是一种空操作(null operation),解释器执行到它的时候,除了检查语法是否合法,什么也不做就直接跳过。它跟 return、break、continue 和 yield 之类的非空操作相比,最大的区别是它不会改变程序的执行顺序。它就像我们写的注释,除了占用一行代码行,不会对所处的作用域产生任何影响。但是,如果你有其它语言的基础,你也许会好奇:为什么 Python 有这么独特的 pass 语句,而别的语言却没有?Python 这么设计,到底是出于什么原因呢?是为了解决大部分编程语言都要面对的共性问题,还是因为它有自己的新发现,所以创造出来一个新的特性?换句话说:Python 为什么要有 pass 语句,它能解决什么问题(好处),如果没有它,会导致什么问题(坏处)?接下来,本文将从两个维度展开分析。1、对人:作为空间占位符我把它看作是一种言简意赅的注释方式,等于是说“这里先预留位置,回头再补上具体的代码实现”。比如在多层的 if-elif-else 结构中,我们可以先把判断条件写好,然后在对应的块中写上 pass,以后再慢慢完善。比如上文中给出的例子,我们可以先写好类/函数名及其入参,然后跳过(pass)主体代码,以后再慢慢填充。pass 写起来简单,而且由于是关键字,IDE 会给出显眼的颜**分,所以就比我们写上注释内容来得方便些。pass 作为空间占位符,主要可以方便我们构思局部的代码结构,有一定的辅助提醒作用。但是,若作为一种注释方式,它就显得太单薄了,比不上写“# todo: xxxx”,后者也会被 IDE 用颜色突显,而且意思更明确。虽然写起来简单,但它也引入了一个看似多余的关键字 pass。所以,从空间占位符的角度来看,pass 不是编程语言中必须的设计要素。有了它,我们可以表达出“此处有东西,但暂时跳过”的语义,但如果没有它,则可以用注释内容来替代。2、对机器:为了语法完整性对于前一条的用法,pass 出现在代码中的位置在理论上是不受限的。但是,我们最常使用 pass 时,基本是在冒号的下一行,而且在该层缩进的代码块中,只有这一条语句。(参见前文的 3 个例子,为了方便,我们仅以以空函数为例)我们可以设想下,如果不写它,会怎样?答案是会报缩进错误:IndentationError: expected an indented block# 将函数体的 pass 去除,会报错 def func(): func()因为 Python 使用缩进来划分代码块(至于原因,请查阅《Python为什么使用缩进来划分代码块?》),而冒号标识着要出现新的缩进代码块,所以这个例子会报缺少缩进代码块。如果我们用前文说的注释来替代,看看会怎样?# 将函数体的 pass 换成注释 def func(): # todo:此处有东西,以后补上 func()这样写,也会报错:IndentationError: expected an indented block原因是注释并非有效的语法内容,它会被 Python 解释器忽略掉(ignore),不像 pass 语句那样是“有效的语法内容,但是跳过”。也就是说,缩进代码块中必须包含有语法意义的内容,下面的例子都是有效的:def func(): """这是一个字符串""" def func2(): 123456Python 在定义函数时,必须包含函数体,即同时包含声明加定义两种语义,不能像某些语言可以只使用声明的语义,即写成void test(); 。但是,由于 Python 不使用花括号,它无法像某些语言那样直接定义出空函数,即写成void test(){} 。综合以上的分析,Python 在定义空函数时,必须要有合法的函数体,因此设计出表示空操作的 pass 语句。它是为了补充语法的完整性,连同冒号,等效于其它语言中一对空的花括号。从语法完整性的维度上看,它是必须的设计要素,如果没有的话,也必须用类似的空语句或特殊符号来替代。对人方面,pass 可以表示“暂时跳过”的含义,作为临时的占位符,最终会被实际的代码实现所替换;对机器方面,它则可以表示“直接跳过”,只为了补齐语法逻辑,并不会被其它代码所替换。其它语言没有专门的一种语句或者符号来表示这种占位符(即语义有所欠缺),但是它们也不需要费心思专门设计一个关键字来补齐语法完整性(即语法完备)。回到本文开头的问题:Python 为什么要有 pass 语句,它能解决什么问题(好处),如果没有它,会导致什么问题(坏处)?Python 使用 pass 语句,是为了支持纯粹空操作的代码块(空函数、空类、空的循环控制块等等),有了它,还能额外表达出一种占位符的语义。前者是对于机器而言的,必须要有,等效于其它语言中空花括号的作用;后者是对于人而言的,非必须的,可以用注释来表达,但因为 Python 设计了这个语句,这种用法有时候还挺方便的。如果你觉得本文分析得不错,那你应该会喜欢这些文章:1、Python为什么使用缩进来划分代码块?2、Python 的缩进是不是反人类的设计?3、Python 为什么不用分号作语句终止符?4、Python 为什么没有 main 函数?为什么我不推荐写 main 函数?5、Python 为什么推荐蛇形命名法?6、Python 为什么不支持 i++ 自增语法,不提供 ++ 操作符?7、Python 为什么只需一条语句“a,b=b,a”,就能直接交换两个变量?本文属于“Python为什么”系列(Python猫出品),该系列主要关注 Python 的语法、设计和发展等话题,以一个个“为什么”式的问题为切入点,试着展现 Python 的迷人魅力。所有文章将会归档在 Github 上,项目地址:https://github.com/chinesehuazhou/python-whydo文章来源: www.cnblogs.com,作者:豌豆花下猫,版权归原作者所有,如需转载,请联系作者。原文链接:https://www.cnblogs.com/pythonista/p/13387235.html
-
python基础语法难点突破1.面向对象类的基本使用知识点:属性:类属性、实例对象属性方法:实例方法、类方法、静态方法类可以调用哪些内容:类属性、类方法、静态方法代码示例:class A(object): # 类属性 class_a = 20 def __init__(self): # 实例对象属性 self.a = 10 # 实例方法 def a_print(self): print("a_print") # 类方法 @classmethod def class_print(cls): print('class_print') # 静态方法 @staticmethod def static_print(): print("static_print")# 类调用类属性,不能调用实例对象属性print(A.class_a)# 使用实例化对象调用实例对象属性print(A().a)# 使用类调用类方法A.class_print()# 使用类调用静态方法A.static_print()# 调用实例方法的两种方式A.a_print(A())A().a_print()12345678910111213141516171819202122232425262728293031323334352.面向对象类的调用和属性知识点:在一个类中想要调用另一个类的方法和属性的方法:继承、属性赋值的形式代码示例:class A(object): class_a = 20 def __init__(self): self.a = 10 def a_print(self): print("a_print") @classmethod def class_print(cls): print('class_print') @staticmethod def static_print(): print("static_print")# 继承class B(A): def b_print(self): print("b_print")B().b_print()B().a_print()# 属性赋值的形式class C(object): obj_a = A() def c_print(self): print('c_print')# 调用A中的方法C.obj_a.a_print()12345678910111213141516171819202122232425262728293031323334353637383.面向对象super和@property的使用知识点:super作用:super() 函数是用于调用父类(超类)的一个方法。super使用场景:重写父类方法,在父类方法的基础上,新增一些业务逻辑使用@property装饰器可以直接通过方法名来访问方法,不需要再在后面使用"()"代码示例:class A(object): def a_print(self): print("a_print")class B(A): def a_print(self): # 调用父类方法 super().a_print() print("add_data") @property def data(self): print("data")B().a_print()# 直接以调用属性的形式调用方法B().data
-
十分钟了解华为云开源软件镜像站同济大学开源软件协会 张子豪 2020-09-20这篇博客要讲什么华为开源镜像站(Mirrors)是由华为云提供的开源组件、开源操作系统及开源DevOps工具镜像站,目前已提供Maven、NPM、NuGet、CentOS、Ubuntu、Debian等镜像下载服务。通过这个博客及配套的视频,介绍华为开源镜像站,并以目前火热的编程语言Python为例,使用华为开源镜像站下载Python安装包,使用华为开源镜像站下载安装人工智能、数据分析、机器学习的Python第三方工具包,大大提升下载速度。什么是开源软件镜像站我是同济子豪兄,这个博客跟大家聊聊程序员都使用过的开发工具,开源软件镜像站。那么,什么是开源镜像站,为什么要有开源镜像站,有哪些开源镜像站,怎么使用开源镜像站呢?作为开发者,程序员,我们每天都要和各种开源编程语言、操作系统、编程工具打交道。而开源软件镜像站就是帮我们在国内免费高速下载这些资源的利器。比如,如果你是Web前端或者后端开发,要用npm下载Node.js的包。如果你是数据分析师,要使用MySQL、PostgreSQL数据库。如果你是人工智能算法工程师,要使用Tensorflow,Pytorch,Keras这些深度学习和机器学习框架。如果你是云计算后端或者运维,要使用Ubuntu,CentOS,Fedora这些Linux发行版,还有Docker,Kubernets容器。就算你是小学生,现在也要学Python编程,Python之所以这么火,一方面是因为语法简单,非常容易上手。另外一方面,Python的PyPI社区有海量第三方开源工具包,涵盖数据挖掘、人工智能、可视化、后端开发方方面面,使用包管理器pip下载pypi社区上的第三方工具包,是每一个学python同学的必备技能。那么问题来了,刚刚上面我们说的所有第三方工具包、开发工具,和操作系统,包括开发者非常熟悉的开源代码托管平台Github里边的海量项目,虽然都是开源的,但很遗憾,绝大部分资源都在海外的服务器上,如果你想在国内网络下载,需要远隔重洋发起网络请求,下载速度会非常非常慢。比如你是一个Python初学者小白,刚刚在电脑上安装好Python,想使用包管理器pip下载著名的人工智能框架Tensorflow,在我的电脑上竟然要二十个小时之久。开源软件镜像站的原理这个时候,开源软件镜像站就闪亮登场了,它完美解决了在国内下载外网开源资源慢的问题。这张图说的非常明白。这个男士,就是我们,椰子是外网的开源资源,但是资源远在海外服务器,直接下载的话会非常慢,甚至完全无法访问,而开源软件镜像站呢,就是这位红衣女郎,她已经帮我们提前从国外获取了这个资源,我们不需要直接去喝椰子,直接从她这里喝就可以了。这位红衣女郎会保持和椰子里一模一样的资源,像照镜子一样,所以称之为“镜像站”。有哪些开源软件镜像站世界著名互联网大厂和高校,比如Facebook、哈佛、MIT都有自己的公共开源镜像站。除了软件行业之外,谷歌学术也有国内镜像站。便于国内的科研人员查论文使用。国内有很多知名的互联网大厂、高校都设立了开源软件镜像站,比如著名的清华大学开源软件镜像站、中科大、阿里云开源镜像站、网易、豆瓣、华为云开源镜像站。有趣的时,不同互联网大厂的开源镜像站,UI界面设计也有天壤之别,从豆瓣pypi镜像站土土的程序猿界面,到网易开源镜像站的工科直男风,再到阿里巴巴镜像站的淘宝橙系风,还有华为云开源镜像站走心的UI设计,华为云开源软件镜像站,由华为云Devcloud运营维护,我们开发者虽说都是直接通过命令行使用镜像站,不会专门看UI设计,但是还是看到了华为对开发者使用体验的尊重。同时,还有一些诸如点击收藏、过滤筛选、关键词搜索的附加功能,便于后续使用。这里有一个帖子,列举了国内所有知名的开源镜像站。这些镜像站呢,分为站点类镜像站、操作系统类镜像站、服务器类镜像站、开发工具和编程语言类镜像站,还有教你怎么搭建自己的镜像站。上面这些国内企业和高校的镜像站,专门服务国内的开发者,提供高速免费的下载服务。在知乎上有一个帖子,里面有清华、中科大、浙大、网易、上科大镜像站的创始人或者运营负责人的心路历程。还有很多高校的开源镜像站,大多服务于校内学生,比如华中科技大学、同济大学、重庆大学、青岛大学镜像站。比如清华大学开源软件镜像站,就是由清华大学学生网络与开源软件协会这个社团负责运营,自动定期和国外源保持镜像同步。比如,Python的Pypi社区每隔五分钟和国外源同步一次。你只需要在命令行里运行这行命令, pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple就可以一劳永逸把Python的pip包下载源永久切换到清华镜像站。也可以把这个链接换成其它的镜像站,达到同样的效果。比如换到华为云开源镜像站。 pip config set global.index-url https://repo.huaweicloud.com/repository/pypi/simple换源后,如果你想下载python的第三方工具包,直接在命令行运行 pip install <第三方包名>即可快速下载安装 例如:pip install pandas这里,我们使用华为云开源镜像站,下载速度还是很快的,不到十秒就下载好pandas了,这是python里面最常用的数据分析工具之一,可以代替excel实现自动化办公,大大提升你的工作效率。像华为云、阿里云、网易、豆瓣这些开源镜像站,背后由互联网和云计算大厂专人维护,无论是基础算力设施、服务器硬件、网络带宽、CDN加速、数据安全隐私,都是稳定可信赖的,而且有覆盖全国,乃至全世界的数据中心,用户体验会很不错。实战华为云开源镜像站下面我就以华为云开源镜像站为例,详细讲讲,除了Python的第三方包之外,还可以获取哪些开源资源,其它国内镜像站呢使用方法都大同小异。作为一个开发者,首先要和各种编程语言打交道,每种编程语言都有自己的包管理器和第三方工具包社区生态,比如JAVA的maven包管理器,Node.js的npm包管理器,Python的pip包管理器和PyPI社区,PHP的Packagist社区,顺便一提,PHP号称是最好的编程语言。Ruby、PHP、.NET语言的开源依赖包,都可以在镜像站中找到。如果你的电脑里安装了这些编程语言,就可以把对应的包管理器的下载源切换到华为云开源镜像站。刚刚讲了python的换源,你同样也可以给Node.js的npm换源,给PHP的packgist换源。都是只需要在命令行里输入一行命令,就可以一劳永逸完成。你还可以在语言组件里指定第三方包社区,以及包的名称,来进行搜索。比如我指定Python的pypi社区,搜索Tensorflow,点击就可以看到最新版本的下载链接,复制这个命令到命令行里运行即可。这是谷歌开源的人工智能和深度学习框架。比如我指定Node.js的npm社区,搜索echarts,点击就可以看到最新版本的下载链接,复制这个命令到命令行里运行即可。这是百度和阿帕奇开源的数据可视化神器。讲完编程语言,再看开发工具,镜像站里涵盖了各种编程语言安装包,比如Python,Node.js,Ruby,还有Web服务器,比如Apache、Nginx,数据库,比如MySQL、PostgreSQL,跨平台应用开发工具Electron,写代码必备的开源文本编辑器Atom,版本控制软件git,Web自动化工具PhatonJs,以及网络自动化调试爬虫神器Selenium。轻量化ssh工具PuTTY,用来连树莓派或者服务器很方便。Linux毫无疑问是程序员和开发者最爱的操作系统,在华为云开源镜像站里可以下载所有常见的Linux发行版,比如CentOS Ubuntu Debian Fedora Deepin Arch Linux Kali OpenSUSE等等。你可以选择x86架构,或者是ARM架构。对于后端运维和云开发者,还有Docker及Kubernetes容器安装包。在OS镜像栏目里,左侧选择Linux发行版,比如ubuntu,fedora,在右侧就可以看到不同版本、不同架构的镜像对于常用到的镜像,点击小爱心收藏,在我的收藏栏目里就能看到。非常方便。感谢华为云、开源社、同济大学开源软件协会、重庆大学开源协会和Linux用户组、网络信息协会对本视频制作的大力支持。最后我想说,不管是阿里、网易还是华为,不管是清华,浙大还是同济,开源软件镜像站都是公益性,非盈利,并且长期维护的,创办开源镜像站不仅需要服务器硬件、网络带宽、技术运维成本,更需要一人栽树、众人乘凉的开源精神和极客风范,让我们向开源镜像站的运营者致敬,他们代表着中国开源社区的过去,现在和未来。彩蛋:华为全联接2020大会偷偷告诉大家,华为全联接2020大会快到了,9月23日至26日在上海世博中心开启,众多大咖共话5G通信、新基建、智能交通、各行业全场景智能连接和数字化转型。9月25日和26日属于开发者日。我到时候也会去参加,给大家带来全程的直播。欢迎大家来找我玩。好了我们下期视频再见,拜拜~
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签