GVKun编程网logo

为什么python不允许在函数和变量名中使用连字符?(python变量为什么不能以数字开头)

11

针对为什么python不允许在函数和变量名中使用连字符?和python变量为什么不能以数字开头这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展C++函数名中使用哪些字符是不允许的?、pyth

针对为什么python不允许在函数和变量名中使用连字符?python变量为什么不能以数字开头这两个问题,本篇文章进行了详细的解答,同时本文还将给你拓展C++ 函数名中使用哪些字符是不允许的?、python – cython:不允许在主包之外的相对cimport、Python 中函数和变量的作用域、Python3 参数和变量等相关知识,希望可以帮助到你。

本文目录一览:

为什么python不允许在函数和变量名中使用连字符?(python变量为什么不能以数字开头)

为什么python不允许在函数和变量名中使用连字符?(python变量为什么不能以数字开头)

我一直想知道为什么我们不能在python中的函数名和变量名之间使用连字符

尝试过使用Lisp和Clojure之类的功能编程语言,允许使用连字符。为什么python不这样做。

# This won''t work -- SyntaxErrordef is-even(num):    return num % 2# This will workdef is_even(num):    return num % 2

我确信,由于某些原因,圭多爵士一定会这样做。我用谷歌搜索,但找不到答案。谁能给我一点启示吗?

答案1

小编典典

因为连字符用作减法运算符。想象一下,您 可以 拥有一个is-even函数,然后拥有如下代码:

my_var = is-even(another_var)

is-even(another_var)对函数的调用is-even,还是even从名为的变量中减去函数的结果is

Lisp方言不存在此问题,因为它们使用前缀表示法。例如,两者之间有明显的区别

(is-even 4)

(- is (even 4))

在Lisps。

C++ 函数名中使用哪些字符是不允许的?

C++ 函数名中使用哪些字符是不允许的?

以下字符不允许出现在 c++++ 函数名中:关键字(如 int、void、bool 等)特殊符号(如 #、%、&、*、- 等)空格(函数名不得包含空格)例外:下划线 (_) 允许用作函数名中的字符美元符号 ($) 和范围运算符 (::) 仅允许用在类的成员函数中

C++ 函数名中使用哪些字符是不允许的?

C++ 函数名中不允许使用的字符

在 C++ 中,函数名遵循与标识符相同的命名规则,以下字符不允许出现在函数名中:

  • 关键字:例如 int、void、bool 等。
  • 特殊符号:例如 #、%、&、*、- 等。
  • 空格:函数名不得包含空格。

例外:

  • 下划线 (_) 允许用作函数名中的字符。
  • 美元符号 ($) 和范围运算符 (::) 仅允许用在类的成员函数中。

实战案例:

立即学习“C++免费学习笔记(深入)”;

// 合法的函数名
int add(int a, int b);
float calculateArea(float radius);

// 非法的函数名(包含关键字)
int void();

// 非法的函数名(包含空格)
double find distance(double x1, double y1, double x2, double y2);

// 合法的函数名(包含下划线)
bool is_valid(int value);
登录后复制

提示:

  • 函数名应以小写字母开头,并使用驼峰命名法(例如 calculateArea)。
  • 避免使用太长的函数名或难以理解的名称。
  • 确保函数名清楚且准确地描述了函数的功能。

以上就是C++ 函数名中使用哪些字符是不允许的?的详细内容,更多请关注php中文网其它相关文章!

python – cython:不允许在主包之外的相对cimport

python – cython:不允许在主包之外的相对cimport

我试图在cython中使用显式相对导入.从 release notes开始,似乎相对导入应该在cython 0.23之后工作,而我使用的是0.23.4和python 3.5.但我得到了这个奇怪的错误,我找不到很多引用.错误仅来自cimport:

driver.pyx:4:0: relative cimport beyond main package is not allowed

目录结构是:

myProject/
    setup.py
    __init__.py
    test/
        driver.pyx
        other.pyx
        other.pxd

好像我可能搞乱了setup.py所以我包含了下面的所有文件.

Setup.py

from setuptools import setup
from distutils.extension import Extension
from Cython.distutils import build_ext

ext_modules = [
    Extension(''other'',[''test/other.pyx''],),Extension(''driver'',[''test/driver.pyx''],]

setup(
    name=''Test'',ext_modules=ext_modules,include_dirs=["test/"],cmdclass={''build_ext'': build_ext},)

driver.pyx

#!/usr/bin/env python
from . import other
from . cimport other

other.pyx

#!/usr/bin/env python

HI = "Hello"

cdef class Other:
    def __init__(self):
        self.name = "Test"

    cdef get_name(self):
        return self.name

other.pxd

cdef class Other:
    cdef get_name(self)

我已经尝试将__init__.py移动到测试中.我已经尝试在测试目录中运行setup.py(适当调整include_dirs).他们都给出了同样的错误.如果我做cimport其他并删除.它可以工作,但这是一个玩具示例,我需要相对导入,以便其他文件夹可以正确导入.这是我能找到的唯一一个这个错误的example,我非常有信心我的问题不同了.

解决方法

我能找到这个错误的唯一其他 example是0700的 hal.pyx.我非常有信心这是一个不同的错误,但今天我意识到在错误解决后,机器工具正在工作,这意味着显式相对导入必须工作.他们的setup.py文件是指linuxcnc,它不在目录树中,但我想是在编译期间的某个时刻创建的.重要的是include_dirs包括父目录而不是子目录.

转换为我的项目结构,这意味着我将myProject放在include_dirs而不是test /.在第guide次读完之后,我终于开始了解python如何看待包.问题是include_dirs是子目录.看起来这有效地使cython将其视为单个平面目录,在这种情况下不允许相对导入?像这样的错误可能会使它更清晰:

ValueError: Attempted relative import in non-package

我仍然没有足够深刻的理解来确切知道发生了什么,但幸运的是,解决方案相对简单.我刚刚更改了include_dirs以使cython识别嵌套文件结构:

from setuptools import setup
from distutils.extension import Extension
from Cython.distutils import build_ext

ext_modules = [
    Extension(''other'',include_dirs=["."],)

现在一切正常!

Python 中函数和变量的作用域

Python 中函数和变量的作用域

正常的函数和变量是公开的(public),可以被直接引用,比如:abcx123PI等;

类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,比如模块中的的__author____name__就是特殊变量;

类似_xxx__xxx这样的函数或变量就是非公开的(private),不应该被直接引用;但Python中并没有一种方法可以完全限制访问非公开的函数或变量,不直接引用是一种约定。

# 非公开,不应直接引用
def _private_1(name):
    return ''Hello, %s'' % name

# 非公开,不应直接引用
def _private_2(name):
    return ''Hi, %s'' % name

# 公开,可以直接引用
def greeting(name):
    if len(name) > 3:
        return _private_1(name)
    else:
        return _private_2(name)

Python3 参数和变量

Python3 参数和变量

在 python 中,类型属于对象,变量是没有类型的。

可更改与不可更改对象

在 python 中,strings, tuples, 和 numbers 是不可更改的对象,而 list,dict 等则是可以修改的对象。

  • 不可变类型:变量赋值 a=5 后再赋值 a=10,这里实际是新生成一个 int 值对象 10,再让 a 指向它,而 5 被丢弃,不是改变a的值,相当于新生成了a。

  • 可变类型:变量赋值 la=[1,2,3,4] 后再赋值 la[2]=5 则是将 list la 的第三个元素值更改,本身la没有动,只是其内部的一部分值被修改了。

python 函数的参数传递:

  • 不可变类型:类似 c++ 的值传递,如 整数、字符串、元组。如fun(a),传递的只是a的值,没有影响a对象本身。比如在 fun(a)内部修改 a 的值,只是修改另一个复制的对象,不会影响 a 本身。

  • 可变类型:类似 c++ 的引用传递,如 列表,字典。如 fun(la),则是将 la 真正的传过去,修改后fun外部的la也会受影响

python 中一切都是对象,严格意义我们不能说值传递还是引用传递,我们应该说传不可变对象和传可变对象。

传不可变对象实例

#!/usr/bin/python3
def ChangeInt( a ):
    a = 10
b = 2
ChangeInt(b)
print( b ) # 结果是 2

实例中有 int 对象 2,指向它的变量是 b,在传递给 ChangeInt 函数时,按传值的方式复制了变量 b,a 和 b 都指向了同一个 Int 对象,在 a=10 时,则新生成一个 int 值对象 10,并让 a 指向它。

传可变对象实例

可变对象在函数里修改了参数,那么在调用这个函数的函数里,原始的参数也被改变了。例如:

#!/usr/bin/python3
# 可写函数说明
def changeme( mylist ):
   "修改传入的列表"
   mylist.append([1,2,3,4]);
   print ("函数内取值: ", mylist)
   return
# 调用changeme函数
mylist = [10,20,30];
changeme( mylist );
print ("函数外取值: ", mylist)

传入函数的和在末尾添加新内容的对象用的是同一个引用。故输出结果如下:

函数内取值:  [10, 20, 30, [1, 2, 3, 4]]
函数外取值:  [10, 20, 30, [1, 2, 3, 4]]

变量作用域

Python 中,程序的变量并不是在哪个位置都可以访问的,访问权限决定于这个变量是在哪里赋值的。

变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。Python的作用域一共有4种,分别是:

  • L (Local) 局部作用域
  • E (Enclosing) 闭包函数外的函数中
  • G (Global) 全局作用域
  • B (Built-in) 内建作用域

以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内建中找。

Python 中只有模块(module),类(class)以及函数(def、lambda)才会引入新的作用域,其它的代码块(如 if/elif/else/、try/except、for/while等)是不会引入新的作用域的,也就是说这些语句内定义的变量,外部也可以访问,

全局变量和局部变量

定义在函数内部的变量拥有一个局部作用域,定义在函数外的拥有全局作用域。

局部变量只能在其被声明的函数内部访问,而全局变量可以在整个程序范围内访问。调用函数时,所有在函数内声明的变量名称都将被加入到作用域中。

#!/usr/bin/python3

total = 0; # 这是一个全局变量
# 可写函数说明
def sum( arg1, arg2 ):
    #返回2个参数的和."
    total = arg1 + arg2; # total在这里是局部变量.
    print ("函数内是局部变量 : ", total)
    return total;

#调用sum函数
sum( 10, 20 );
print ("函数外是全局变量 : ", total)

global 和 nonlocal关键字

内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。

以下实例修改全局变量 num:

#!/usr/bin/python3

num = 1
def fun1():
    global num  # 需要使用 global 关键字声明
    print(num) 
    num = 123
    print(num)
fun1()

如果要修改嵌套作用域(enclosing 作用域,外层非全局作用域)中的变量则需要 nonlocal 关键字了,如下实例:

#!/usr/bin/python3
 
def outer():
    num = 10
    def inner():
        nonlocal num   # nonlocal关键字声明
        num = 100
        print(num)
    inner()
    print(num)
outer()

 

 

参数

必需参数

必需参数须以正确的顺序传入函数。调用时的数量必须和声明时的一样。

#!/usr/bin/python3
 
#可写函数说明
def printme( str ):
   "打印任何传入的字符串"
   print (str);
   return;
 
#调用printme函数
printme("geng");

关键字参数

关键字参数和函数调用关系紧密,函数调用使用关键字参数来确定传入的参数值。

使用关键字参数允许函数调用时参数的顺序与声明时不一致,因为 Python 解释器能够用参数名匹配参数值。

必须参数要求顺序一致,多余的参数做关键字参数时则不必须顺序一致。

lambda 匿名函数也是可以使用"关键字参数"进行参数传递。

#!/usr/bin/python3
 
#可写函数说明
def printme( str ):
   "打印任何传入的字符串"
   print (str);
   return;
 
#调用printme函数
printme( str = "菜鸟教程");

默认参数

调用函数时,如果没有传递参数,则会使用默认参数。默认参数必须放在最后面,否则会报错。

#!/usr/bin/python3
 
#可写函数说明
def printinfo( name, age = 35 ):
   "打印任何传入的字符串"
   print ("名字: ", name);
   print ("年龄: ", age);
   return;
 
#调用printinfo函数
printinfo( age=50, name="runoob" );
print ("------------------------")
printinfo( name="runoob" );

不定长参数

你可能需要一个函数能处理比当初声明时更多的参数。这些参数叫做不定长参数,和上述2种参数不同,声明时不会命名。

#!/usr/bin/python3
 
# 可写函数说明
def printinfo( arg1, *vartuple ):
   "打印任何传入的参数"
   print ("输出: ")
   print (arg1)
   for var in vartuple:
      print (var)
   return;
 
# 调用printinfo 函数
printinfo( 10 );
printinfo( 70, 60, 50 ); # 70是arg1的值

加了星号(*)的变量名会存放所有未命名的变量参数。如果在函数调用时没有指定参数,它就是一个空元组。我们也可以不向函数传递未命名的变量。

如果存在一个**vardict形式的形式参数,它将接收一个字典(参见映射类型——字典),这个字典包含除形式参数之外的所有关键字参数。
它可以与*vartup形式的形式参数组合,这种形式接收一个元组,这个元组包含除形式参数之外的所有位置参数。(*vartup必须出现在**vardict之前)

def test(**kr):
    return kr
def test2(*z):
    return z
def test3(*kr,**z):
    return kr,z
def test4(a,b=1,e=3,*c,**d):
    return a,b,e,c,d
print(test(a=4,b=2,c=5))    
print(test2(1,2,3,4))
print(test3(''a'',''b'',''c'',a=1,b=3))
print(test4(1,1,2,2,3,4,c=5))
#输出
{''a'': 4, ''b'': 2, ''c'': 5}
(1, 2, 3, 4)
((''a'', ''b'', ''c''), {''a'': 1, ''b'': 3})
(1, 1, 2, (2, 3, 4), {''c'': 5})

 

我们今天的关于为什么python不允许在函数和变量名中使用连字符?python变量为什么不能以数字开头的分享已经告一段落,感谢您的关注,如果您想了解更多关于C++ 函数名中使用哪些字符是不允许的?、python – cython:不允许在主包之外的相对cimport、Python 中函数和变量的作用域、Python3 参数和变量的相关信息,请在本站查询。

本文标签: