一.第一类对象, 函数名的使用

函数名就是变量名, 函数名存储的是函数的内存地址

  1. 变量的命名规范:
  2. 由数字, 字母, 下划线组成
  3. 不能是数字开头, 更不能是纯数字
  4. 不能用关键字
  5. 不要太长
  6. 要有意义
  7. 不要用中文
  8. 区分大小写
  9. 驼峰或者下滑线

2. 闭包
闭包: 在内层函数中引入外层函数的变量
作用:

  1. 保护变量不受侵害(javascript)
  2. 让一个变量常驻内存

 

*闭包的作用:保护我们的变量,必须是局部变量
a = 10 # 全局的东西都是不安全的 def func1():
print(a) def func2():
print(a) func1() # 你的同事搞事情
def func3():
global a
a = 20 func3() func2() def func():
a = 10 # 安全的
def func2():
print(a)
def func3():
print(a)
def func4():
nonlocal a
a = 20 闭包: 内层函数对外层函数的变量的使用
作用:
1. 保护我们的变量不受侵害
2. 可以让一个变量常驻内存. def outer():
# a = 10
def inner():
print("哈哈")
print(inner.__closure__) # (<cell at 0x000001C079677588: int object at 0x0000000054776D30>,)
return inner ret = outer()
# 1800行代码...
ret() # 由于inner函数执行的时机是不确定的. 必须要保证innter可以正常执行. 必须把a保留到最后 # 爬虫 (low版本)
from urllib.request import urlopen # 打开一个连接用的模块
# 外层函数
def but():
# 打开连接. 读取源代码
content = urlopen("http://www.cctv.com/").read() # 永久驻留在内存
# 内层函数
def get_content():
# 返回content
return content
return get_content # 内层函数 fn = but() # 这里会很慢. 需要网络请求
print(fn()) # 不会再进行网络请求了
print(fn()) 关联的小点
def func(a, b):
'''
文档注释
这个函数用来计算两个数的和并返回
:param a: 第一个数
:param b: 第二个数
:return: 第一个数和第二个数的和
author:sylar
date:2018-10-31
'''
print("我是func")
return a + b
print(func.__doc__) # document 文档注释
print(func.__name__) # name 名字 获取函数名

  

二. 迭代器
dir() 查看变量能够执行的方法(函数)
Iterator: 迭代器, __iter__(), __next__()
Iterable: 可迭代的, __iter__()

for循环的流程:
it = lst.__iter__()
while 1:
try:
el = it.__next__()
for循环的循环体
except StopIteration:
break

从迭代器中获取数据的唯一方法: __next__()

迭代器的三个特征:

  1. 省内存
  2. 惰性机制
  3. 只能往前. 不能后退
print(dir(str)) # 查看str能够执行的操作. 内部的方法
__iter__ 字符串可以被迭代. 发现了__iter__
print(dir(list))
print(dir(open("x",mode="w"))) # int中没有__iter__ 简单的下一个结论. 主要这个数据类型可以执行__iter__ 可以被迭代的数据类型
lst = ["汉高祖", "清高祖", "明高祖", "哈哈", "娃哈哈", "爽歪歪"]
it = lst.__iter__() # <list_iterator object at 0x000001ED54B17128> iterator 迭代器
print(it)
print(dir(it)) # 迭代器本身是可迭代的
可以使用__next__获取数据
print(it.__next__()) # 汉高祖
print(it.__next__()) # 清高祖
print(it.__next__()) # 明高祖
print(it.__next__()) # 明高祖
print(it.__next__()) # 明高祖
print(it.__next__()) # StopIteration 迭代器中没有元素了. for循环内部的代码
it = lst.__iter__() # 获取新的迭代器
while 1:
try:
el = it.__next__()
print(el)
except StopIteration:
print("结束了")
break list(内部有for循环)
for内部 迭代器
lst = [1,55,5,55,5,5,5,555,55,555]
ll = list(set(lst))
print(ll)
list(1) # 'int' object is not iterable 如何判断一个数据是否是可迭代对象
1. dir() -> __iter__ 可迭代的
dir() -> __next__ 迭代器
lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"]
print("__iter__" in dir(lst)) # True 可迭代的
print("__next__" in dir(lst)) # False 不是迭代器 print("__iter__" in dir(int))
print("__next__" in dir(int)) it = lst.__iter__() # 迭代器
print("__iter__" in dir(it)) # True 迭代器本身就是可迭代的
print("__next__" in dir(it)) # True
lst = ["秦始皇", "汉武帝", "孝文帝", "隋炀帝", "李世民"] # collections 关于集合类的相关操作
# Iterable : 可迭代的
# Iterator : 迭代器
from collections import Iterable, Iterator
print(isinstance(lst, Iterable)) # True
print(isinstance(lst, Iterator)) # False print(isinstance({1,2,3}, Iterable)) # True, 可以使用for循环

三..练习

1.写函数,接收一个参数(此参数类型必须是可迭代对象),将可迭代对象的每个元素以’_’相连接,形成新的字符串,并返回.
例如 传入的可迭代对象为[1,'老男孩','武sir']返回的结果为’1_老男孩_武sir’
def func(can):
if "__iter__" in dir(can): # 判断是否是可迭代的
result = ""
for item in can: # 传递的参数中的每一个元素 "周杰伦"
result += str(item)+"_"
return result.strip("_")
else: # 不是可迭代的
return None # 回去 , 正常来讲这里应该抛出异常. print(func((1,'老男孩','武sir'))) 2.打印图形
*
* * *
* * * * *
* * * * * * *
n = int(input("请输入你要打印多少行"))
for i in range(1, n+1):
# 方案一
for k in range(n-i):
print(" ", end="")
for j in range(2 * i - 1):
print("*", end="")
print() # 换行 #方案二
for i in range(1,n+1)
print(" " * (n - i) + "*" * (2 * i - 1)) 3.求1-100内所有的质数的和(升级题) def func(n): # 只能被1和自身整除的数
if n == 1: # 特殊处理的
return False
# n / 2, 3, 4, 5, 6, 7, 8, 9....n-1
for i in range(2, n):
if n % i == 0: # 不是质数
return False
else:
return True
print(func(2))
sum = 0
for i in range(1, 101):
if func(i): # 如果是质数. 帮我累加
sum += i
print(sum)

  

python函数名称的更多相关文章

  1. python函数名称空间

    一.命名空间概念 命名空间(name space),若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方.命名空间分三种: locals:函数内的名称空间,包括局部变量和形参 gl ...

  2. python函数名称空间与作用域、闭包

    一.命名空间概念 1.命名空间(name space) 名称空间是存放名字的地方. 若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方. 2.名称空间加载顺序 python te ...

  3. python函数----名称空间和作用域

    一 名称空间 名称空间即存放名字与对象映射/绑定关系的地方. 对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系. ​在程序执行 ...

  4. Python 获取被调用函数名称,所处模块,被调用代码行

    获取被调用函数名称,所处模块,被调用代码行 by:授客 QQ:1033553122 module2.py: #!/usr/bin/env python # -*- coding:utf-8 -*- _ ...

  5. python笔记19-获取当前运行函数名称和类方法名称

    前言 写完代码之后,一般为了方便查看日志,可以在日志输出中加入当前运行的函数名称或类和方法名称,以便于代码报错的时候能快速找到报错的是哪个函数或方法. 那么如何获取当前运行函数(或方法)的名称呢? 获 ...

  6. 【Python】—— 获取当前运行函数名称和类方法名称

    原文出处: python笔记19-获取当前运行函数名称和类方法名称 获取函数名称 1.在函数外部获取函数名称,用.__name__获取 2.函数内部获取当前函数名称,用sys._getframe(). ...

  7. Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法

    Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global以及nolocal的用法 目录 Python函数02/函数的动态参数/函数的注释/名称空间/函数的嵌套/global ...

  8. Python 空间名称与闭包函数

    空间名称与闭包函数 名称空间 名称空间 namespaces:存放名字的地方,是对栈区的划分 名称空间在栈区中分为三种,详细的划分不同的空间,不同空间可以存放相同名字的名字 内置名称空间 存放的名字: ...

  9. python函数 与 函数式编程

    「函数」一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,具体区别,我们后面会讲,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫做subroutine(子过程或子程序), ...

随机推荐

  1. ECharts + Jquery 做大屏展示

    HTML <!doctype html> <html> <head> <meta charset="utf-8"> <meta ...

  2. CentOS7安装MySQL冲突和问题解决小结

    摘自:https://blog.csdn.net/typa01_kk/article/details/49059729 问题1: [root@localhost install-files]# rpm ...

  3. Kali linux创建和删除用户

    #创建用户 图形界面如此友好,直接点用户——添加用户——设置密码即可,如果切换帐号,同样点用户——切换用户——输入密码即可. #删除用户的指令比较复杂一些,这里我们找到了特别好的资源,简明有效. ht ...

  4. Linux 安装 mysql 数据库

    1. 克隆虚拟机 2. 上传安装文件 1.上传文件 2.解压文件 tar -xvf 文件 3. 安装数据库 安装顺序: .debuginfo .shared .client .server 1. rp ...

  5. eval & sleep

    ltp-ddt can_loopback source 'functions.sh'; interface='can0'; bitrate=; do_cmd "do_can_loopback ...

  6. Eloquent JavaScript #09# Regular Expressions

    索引 Notes js创建正则表达式的两种方式 js正则匹配方式(1) 字符集合 重复匹配 分组(子表达式) js正则匹配方式(2) The Date class 匹配整个字符串 Choice pat ...

  7. 从零开始部署一个 Laravel 站点

    从零开始部署一个 Laravel 站点 此文章为原创文章,未经同意,禁止转载. PHP Laravel Web Git 在阿里云买ECS的时候选择自己习惯的镜像系统,我一般都是使用Linux Ubun ...

  8. centos6安装多实例mysql

    centos 6.5,使用二进制安装多实例mysql 5.5.60 所需安装包mysql-5.5.60-linux-glibc2.12-x86_64.tar.gz.ncurses-devel-5.7- ...

  9. oracle 12cR1&12cR2核心高实用性新特性

    今天把本地环境升到了12.2.12c应该来说无论从性能和功能性方面都得到了很大的加强,就是不知道实际license怎么卖...原来有些功能在exadata中可用的,现在在12c中可用了,估计很大程度上 ...

  10. 写给大忙人的CentOS 7下最新版(6.2.4)ELK+Filebeat+Log4j日志集成环境搭建完整指南

    现在的公司由于绝大部分项目都采用分布式架构,很早就采用ELK了,只不过最近因为额外的工作需要,仔细的研究了分布式系统中,怎么样的日志规范和架构才是合理和能够有效提高问题排查效率的.经过仔细的分析和研究 ...